将函数作为模板参数传递

3

我正在尝试将一个函数作为参数传递给一个模板类 - 目标是随后可以传递任何函数作为参数并实现不同的功能:

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类并解决编译问题?

1
请注意,您可以通过删除B3(以及可能的B1和make_B)来简化示例。 - Martin Bonner supports Monica
2个回答

4

您需要在第auto B2 = ...行的模板参数中删除函数名A,使其看起来像这样:

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

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

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

注意,当将A传递给B的构造函数时,您可以选择省略&(但对于decltype(&A)不起作用),因为它会被隐式转换为函数指针。

谢谢,但是这两个语句 - auto B3 = B<decltype(&A)>(&A); 和 auto B3 = B<decltype(&A)>(A); 都可以编译并执行函数 - 我有什么遗漏的吗?你是在说我们应该只使用 auto B3 = B<decltype(&A)>(A); 这个语句吗? - Programmer
2
是的,它们都可以编译,我认为没有一个版本应该因为某种原因而被优先选择。我只是喜欢少打一个字符,这给了我更高效的错觉 :) - lubgr

2

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

这行代码:

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

should be:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接