相关疑难解决方法(0)

c ++ 0x:在lambda arity上重载

我正在尝试创建一个可以使用带有0,1或2个参数的lambda调用的函数.由于我需要代码在g ++ 4.5和vs2010上工作(它不支持可变参数模板或lambda转换到函数指针),我想出的唯一想法是选择基于arity调用哪个实现.以下是我应该如何看待的非工作猜测.有没有办法修复我的代码或者有更好的方法来执行此操作?

#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;});
}
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

8
推荐指数
1
解决办法
2416
查看次数

了解功能特征模板的工作原理。特别是,指向成员函数的指针是如何处理的

我试图理解这段代码,并且我发现了一些关于这个主题的更多内容。

以紧凑的形式:

#include <tuple>
namespace sqlite {
    namespace utility {
        template<typename> struct function_traits;

        template <typename Function>
        struct function_traits : public function_traits<
            decltype(&Function::operator())
        > {  };

        template <
            typename    ClassType,
            typename    ReturnType,
            typename... Arguments
        >
        struct function_traits<
            ReturnType(ClassType::*)(Arguments...) const
        > {
            typedef ReturnType result_type;

            template <std::size_t Index>
            using argument = typename std::tuple_element<
                Index,
                std::tuple<Arguments...>
            >::type;

            static const std::size_t arity = sizeof...(Arguments);

        };
    }
}
Run Code Online (Sandbox Code Playgroud)

这使我了解了该语言的指向成员函数的指针特性,并且此时我非常清楚如何使用函数特征(相当简单,我不仅可以提取返回类型,还可以提取数量,甚至参数的类型),但我一直在理解为什么它有效,或者为什么它甚至可能有效......

c++ template-meta-programming

2
推荐指数
1
解决办法
4813
查看次数

标签 统计

c++ ×2

c++11 ×1

lambda ×1

template-meta-programming ×1