Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Lambdas的模板类型推断_C++_Templates_Lambda_Type Deduction - Fatal编程技术网

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;
}