Я пытаюсь написать функцию вызывающей стороны, которая может принимать необязательный аргумент с переменным типом шаблона.
#include <iostream>
#include <string>
void f_int(int x){std::cout << "f_int\n";}
void f_double(double x){std::cout << "f_double\n";}
void f_void(void){std::cout << "f_void\n";}
template<typename T>
void caller(void (*fun)(T), T arg)
{
(*fun)(arg);
}
int main()
{
caller(f_int, 3);
caller(f_double, 2.1);
caller(f_void); // compilation error
caller(f_void, void); // compilation error
void* p;
caller(f_void, *p); // compilation error
}
При написании этого кода я надеялся, что T
может иметь тип void
,Может ли это быть? Если да, почему вышеприведенный код не работает? Является ли void
допустимым типом или только void*
допустимым типом?