C++ 使用Lambdas的模板类型推断
我面临的问题很简单。给定以下代码:C++ 使用Lambdas的模板类型推断,c++,templates,lambda,type-deduction,C++,Templates,Lambda,Type Deduction,我面临的问题很简单。给定以下代码: template <typename ReturnType, typename... Args> auto CallIt( ReturnType( *method )( Args... ) ) { return method; } auto test = CallIt( [] ( int a, int b ) { return a > b; } ); 模板 自动调用(返回类型(*方法)(参数…) { 返回法; } 自动测试
template <typename ReturnType, typename... Args>
auto CallIt( ReturnType( *method )( Args... ) )
{
return method;
}
auto test = CallIt( [] ( int a, int b )
{
return a > b;
} );
模板
自动调用(返回类型(*方法)(参数…)
{
返回法;
}
自动测试=CallIt([](内部a、内部b)
{
返回a>b;
} );
我(在2013年11月的CTP编译器中使用VS13)得到的错误是:
无法从main()推断ReturnType(_cdecl*)(Args…)的模板参数:
我知道lambda不是函数指针,但不捕获的lambda可以分配给匹配签名的函数指针。如果显式指定模板参数,则此操作有效。我希望看到一种不必显式指定模板参数的方法。提前感谢您的帮助
如Marco A提供的答案注释所述,可能有一种解决方案,使用lambda类上的一元+运算符,有效地将其转换为函数指针。但是,在请求的IDE/编译器组合中,我收到以下警告:
从“lambda[]bool(int a,int b)->bool”到内置类型的多个转换函数适用于:
函数“lambda[]bool(inta,intb)->bool::运算符bool(*)(inta,intb)()常量”
函数“lambda[]bool(inta,intb)->bool::运算符bool(*)(inta,intb)()常量”
函数“lambda[]bool(inta,intb)->bool::运算符bool(*)(inta,intb)()常量”
函数“lambda[]bool(inta,intb)->bool::运算符bool(*)(inta,intb)()常量”
此intellisense错误揭示了生成的编译错误,指定:
错误C2593:“运算符+”不明确
1) 添加一个适当的
2) 如果希望传递函数指针,请使用lambda
模板
自动调用(ReturnType(*方法)(Args…)->ReturnType(*)(Args…)
{
返回法;
}
自动测试=CallIt(+[])(内部a、内部b)
{
返回a>b;
} );
编辑:MSVC2013似乎有问题。作为一种解决方法,如果以下方法暂时有效,您可以尝试:
#include <iostream>
#include <functional>
using namespace std;
template <typename ReturnType, typename... Args>
auto CallIt( std::function<ReturnType( Args... )> method ) -> std::function<ReturnType( Args... )>
{
return method;
}
int main() {
std::function<bool(int,int)> lambda = [] ( int a, int b ) { return a > b; };
auto test = CallIt( lambda );
cout << test(4,1);
return 0;
}
#包括
#包括
使用名称空间std;
模板
自动调用(std::function方法)->std::function
{
返回法;
}
int main(){
函数lambda=[](inta,intb){返回a>b;};
自动测试=测径(λ);
模板函数不能得到类型推断,从Lambda到函数指针的转换可能涉及一些隐含的转换。有关解决此问题的方法,请参阅上一个问题。您能否详细说明为什么这里需要前缀+
运算符?@Chnossos发布的链接中解释了这一点:它允许转换Lambda->函数指针。我询问时没有链接。感谢您提供它。这是我第一次听说lambdas上的+
前缀,我在使用指定的IDE/编译器时遇到问题。错误是运算符+不明确
@williamcustome:不应该是这样的…它与gcc和clang一起工作,所以我想ss这是另一个VS怪癖。
template <typename ReturnType, typename... Args>
auto CallIt( ReturnType( *method )( Args... ) ) -> ReturnType(*)(Args...)
{
return method;
}
auto test = CallIt( +[] ( int a, int b )
{
return a > b;
} );
#include <iostream>
#include <functional>
using namespace std;
template <typename ReturnType, typename... Args>
auto CallIt( std::function<ReturnType( Args... )> method ) -> std::function<ReturnType( Args... )>
{
return method;
}
int main() {
std::function<bool(int,int)> lambda = [] ( int a, int b ) { return a > b; };
auto test = CallIt( lambda );
cout << test(4,1);
return 0;
}