在模板中使用匿名函数时遇到错误

Encountering error when using anonymous function in template

我在使用模板时遇到匿名函数错误。我想创建一个函数并将参数传递给它。这应该很简单,但我收到了错误。如果我不使用模板而只是替换实际类型,那么代码就可以工作。我做错了什么?

没有匹配函数调用 'print'

template <typename mytype>
void print(mytype arg1, std::function<void(mytype)> arg2)
{
   arg2(arg1);
}
.
.
auto myLamba = [](int x){std::cout << "x = " << x << std::endl;};
print (9999, myLamba);

lambda 不是 std::function。它可以转换为 std::function,但在您的模板中,您将 mytype 与两个参数匹配。

这意味着参数必须能够在不对模板的两个参数进行任何转换的情况下进行精确匹配才能成为有效匹配。

您可以明确声明类型以使其工作

print<int>(9999, myLamba);

然而,更好的选择是不使用 std::function,只让可调用对象成为一个单独的模板参数。这样可以传入任何类型的可调用对象,作为奖励,您可以避免将其类型擦除为 std::function.

的开销
template <typename mytype, typename Func>
void print(mytype arg1, Func arg2)
{
   arg2(arg1);
}

auto myLamba = [](int x){std::cout << "x = " << x << std::endl;};
print (9999, myLamba); // Now this works