将函数作为模板参数传递

时间:2018-07-13 06:30:36

标签: c++ c++11 c++14

我试图将函数作为参数传递给模板类-目的是让我可以将任何函数作为参数传递并实现不同的功能:

int A() 
{ 
return 0; 
}

void Test() {
    auto B2 = B<int(*A)()>(&A);
}

int main()
{
Test();
}

但是我遇到编译问题:

$ c++ -std=c++14 try.cpp
try.cpp: In function 'void Test()':
error: cast from 'int (*)()' to 'int' loses precision [-fpermissive]
     auto B2 = B<int(*A)()>(&A);
                       ^                       ^

如何用任何返回类型的函数实例化B类并接受任何参数并解析编译?

2 个答案:

答案 0 :(得分:4)

您应该在行A的模板参数中删除函数名称auto B2 = ...,如下所示:

auto B2 = B<int(*)()>(A);

名称不是类型说明符的一部分,并且类型是编译器在尝试实例化类模板时唯一要查找的内容。您可以使用此代码段引用该函数的名称,并让编译器推断其类型:

auto B2 = B<decltype(&A)>(A);

请注意,将&传递给A的构造函数时,可以选择将B放在decltype(&A)之前(尽管不适用于event.stopPropagation()),因为它是隐式的转换为函数指针。

答案 1 :(得分:2)

函数名称不是函数指针类型的一部分。

此行:

auto B2 = B<int(*)()>(&A);

应为:

{{1}}