将 lambda 作为参数传递时的重载函数
Overloading function when passing lambda as parameter
当返回参数为 void 或 T 时,我正在尝试实现模板函数。我使用 sfinae 尝试了上述代码的不同变体,但仍然不确定在 lamdba 是函数参数的情况下这是否通常可行。以下代码不编译:
#include <functional>
template <typename T>
T Apply(const std::function<T()>& func)
{
return func();
}
template <>
void Apply(const std::function<void()>& func)
{
func();
}
int main(int argc, char *argv[])
{
int i1 = Apply([]() { return 10; });
bool b1 = Apply([]() { return true; });
Apply([]() { return; });
return 0;
}
错误:
error C2672: 'Apply': no matching overloaded function found
error C2784: 'T Apply(const std::function<T(void)> &)': could not deduce template argument for 'const std::function<T(void)> &' from 'main::<lambda_536cc9cae26ef6d0d1fbeb7b66a2e26b>'
魔杖盒直播
不幸的是,
你不能这样做,因为隐式转换(从 lambda 闭包类型到 std::function
(在模板参数推导中不考虑; 代码失败,因为无法推断T
。
您可以直接使用 lambda 闭包类型作为参数类型,并将返回类型声明为要自动推导的auto
。
template <typename T>
auto Apply(T func)
{
return func();
}
住
这是因为模板推导需要对每个函数参数进行完美匹配才能成功推导出模板参数。
你需要对函数对象本身进行寺庙化:
#include <type_traits>
template <class Function, class Return = std::result_of_t<Function()>>
Return Apply(Function func)
{
return func();
}
用法:
#include <iostream>
int main()
{
std::cout << Apply([]() { return 42; }) << "n";
}
现场演示
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?