c ++:带模板的函数指针

c++: function pointer with template

void func1(int){}
void func2(char){}

template <typename T> void (*p)(T);   // error
p = func1;
p = func2;

为什么我们不能像p那样定义一个指针?

你可以这样做:

template<class T> using p = void (*)(T);

void f(int );
p<int> x = &f;

C++14实际上允许变量模板,所以你对模板的定义p是有效的。

但是,p是变量模板,不是变量;为了获得实际变量,您需要使用特定类型实例化它,如下所示:

p<int> = func1;
p<char> = func2;

在您的示例中,变量 p 可以分配给不相关类型的对象(此处为两个不兼容的函数指针)。模板不支持明显类型的这种动态变化,模板是严格静态(编译时)构造。

如果要实现这样的类型转换对象,必须应用类型擦除技术。在那种特定情况下,std::function 看起来对你有用,但你仍然需要决定一个固定的函数签名(否则你会怎么称呼它?)。

感谢@SergeyA 和@Brian 的帮助,我解决了这个问题,我在这里编辑我的答案。

template<typename T> void (*p)(T):在这种情况下,p 是一个变量模板 (c++14)。所以我们可以这样使用p

p<int> = func1;
p<char> = func2;

template<class T> using p = void (*)(T):在这种情况下,p 是一种类型(它就像 typedef 但我们不能使用 typedef 作为别名模板)。意思是我们应该这样使用它:

p<int> x1 = func1;
p<char> x2 = func2;

顺便说一句,它们都是template declaration,所以我们不能把它们放在任何块范围内。