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
,所以我们不能把它们放在任何块范围内。
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
,所以我们不能把它们放在任何块范围内。