Я пытаюсь создать функцию, которая может быть вызвана с помощью лямбды, которая принимает 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;});
}