gpt4 book ai didi

c++ - 使用 Lambda 进行模板类型推导

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:12 27 4
gpt4 key购买 nike

我面临的问题很简单。给定以下代码:

template <typename ReturnType, typename... Args>
auto CallIt( ReturnType( *method )( Args... ) )
{
return method;
}

auto test = CallIt( [] ( int a, int b )
{
return a > b;
} );

我得到的错误(使用 VS13 和 2013 年 11 月 CTP 编译器)是:

Could not deduce template argument for ReturnType (__cdecl *)(Args...) from main::<lambda_e795bf5a030334e5fc8f3c26dbe00e0e>

我理解lambda不是函数指针,但是不捕获的lambda可以赋值给匹配签名的函数指针。如果您显式指定模板参数,则此方法有效。我很想看到一种无需显式指定模板参数即可工作的方法。预先感谢您的帮助。

如 Marco A. 提供的答案的评论中所述,使用 lambda 类上的一元 + 运算符可能会解决此问题,有效地将其转换为函数指针。但是,在请求的 IDE/编译器组合中,我收到以下警告转错误:

more than one conversion function from "lambda []bool (int a, int b)->bool" to a built-in type applies:

function "lambda []bool (int a, int b)->bool::operator bool (*)(int a, int b)() const"

function "lambda []bool (int a, int b)->bool::operator bool (*)(int a, int b)() const"

function "lambda []bool (int a, int b)->bool::operator bool (*)(int a, int b)() const"

function "lambda []bool (int a, int b)->bool::operator bool (*)(int a, int b)() const"

此智能感知错误揭示了指定生成的编译错误:

error C2593: 'operator +' is ambiguous

最佳答案

1) 添加适当的 trailing return type

2) 如果你想传递一个函数指针,使用 lambda conform to that

template <typename ReturnType, typename... Args>
auto CallIt( ReturnType( *method )( Args... ) ) -> ReturnType(*)(Args...)
{
return method;
}

auto test = CallIt( +[] ( int a, int b )
{
return a > b;
} );

Live Example


编辑: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;
}

Live Example

关于c++ - 使用 Lambda 进行模板类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25038534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com