c ++ 0x: перегрузка по лямбда-арности

Я пытаюсь создать функцию, которая может быть вызвана с помощью лямбды, которая принимает 0, 1 или 2 аргумента . Поскольку мне нужен код для работы как с g ++ 4.5, так и с vs2010 (который не поддерживает вариативные шаблоны или лямбда-преобразования в указатели функций), единственная идея, которую я Мы придумали, какую реализацию вызывать на основе арности. Ниже я не могу представить, как это должно выглядеть. Есть ли способ исправить мой код или есть лучший способ сделать это вообще?

#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;});
}
8
задан Motti 19 December 2010 в 13:47
поделиться