繁体   English   中英

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM