我正在尝试创建一个函数,它接受任何返回void的函数,并通过简单地调用原始函数并返回false来生成返回bool的函数。
template<typename Arg>
auto voidToBoolTemplate(std::function<void(Arg)> func)
{
return [&](Arg arg)
{
func(arg);
return false;
};
}
但是,我无法将lambda传递给此函数。
auto lambda = [](int x)
{
std::cout << x << '\n';
};
voidToBoolTemplate(lambda);
这是我用clang 3.7.0得到的错误:
Error(s):
source_file.cpp:32:5: error: no matching function for call to 'voidToBoolTemplate'
voidToBoolTemplate(lambda);
^~~~~~~~~~~~~~~~~~
source_file.cpp:5:6: note: candidate template ignored: could not match 'function<void (type-parameter-0-0)>' against '(lambda at source_file.cpp:25:19)'
auto voidToBoolTemplate(std::function<void(Arg)> func)
将lambda分配给std :: function,然后调用该函数。
auto lambda = [](int x)
{
std::cout << x << '\n';
};
std::function<void(int)> foo = lambda;
voidToBoolTemplate(foo);
另外,如果我为参数使用特定类型,我可以传递lambda:
auto voidToBoolNonTemplate(std::function<void(int)> func)
{
return [&](int arg)
{
func(arg);
return false;
};
}
auto lambda = [](int x)
{
std::cout << x << '\n';
};
voidToBoolNonTemplate(lambda);
任何人都可以解释这种行为吗?