gpt4 book ai didi

C++0x : overloading on lambda arity

转载 作者:可可西里 更新时间:2023-11-01 17:19:12 25 4
gpt4 key购买 nike

我正在尝试创建一个可以使用带有 0、1 或 2 个参数的 lambda 调用的函数。由于我需要代码在 g++ 4.5 和 vs2010(不支持可变参数模板或 lambda 转换为函数指针)上工作,所以我想到的唯一想法是根据元数选择要调用的实现。以下是我对这应该如何看的非工作猜测。有什么方法可以修复我的代码,或者有更好的方法来解决这个问题吗?

#include <iostream>
#include <functional>
using namespace std;

template <class Func> struct arity;

template <class Func>
struct arity<Func()>{ static const int val = 0; };

template <class Func, class Arg1>
struct arity<Func(Arg1)>{ static const int val = 1; };

template <class Func, class Arg1, class Arg2>
struct arity<Func(Arg1,Arg2)>{ static const int val = 2; };

template<class F>
void bar(F f)
{
cout << arity<F>::val << endl;
}

int main()
{
bar([]{cout << "test" << endl;});
}

最佳答案

lambda 函数是一种具有单个函数调用运算符的类类型。因此,您可以通过获取其地址并使用重载决策来选择要调用的函数来检测该函数调用运算符的数量:

#include <iostream>

template<typename F,typename R>
void do_stuff(F& f,R (F::*mf)() const)
{
(f.*mf)();
}

template<typename F,typename R,typename A1>
void do_stuff(F& f,R (F::*mf)(A1) const)
{
(f.*mf)(99);
}

template<typename F,typename R,typename A1,typename A2>
void do_stuff(F& f,R (F::*mf)(A1,A2) const)
{
(f.*mf)(42,123);
}

template<typename F>
void do_stuff(F f)
{
do_stuff(f,&F::operator());
}

int main()
{
do_stuff([]{std::cout<<"no args"<<std::endl;});
do_stuff([](int a1){std::cout<<"1 args="<<a1<<std::endl;});
do_stuff([](int a1,int a2){std::cout<<"2 args="<<a1<<","<<a2<<std::endl;});
}

不过要小心:这不适用于函数类型或具有多个函数调用运算符或非const 函数调用运算符的类类型。

关于C++0x : overloading on lambda arity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4170201/

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