Есть ли способ сократить лямбда-сигнатуру C ++ 11 в декларации?

Я хочу сократить лямбды следующего типа:

[] (SomeVeryLongTemplateType<int, float, char, std::string>, AnotherLongType) {};

Поскольку единственная причина этой лямбды — инициализация некоторого класса std::function<...> member — он ничего не захватывает, у него нет имен аргументов, он ничего не возвращает, он ничего не делает.

Если операция сокращения выражается как функция от количества аргументов в сигнатуре, то я хочу, чтобы эта функция имела сложность O (1).

Есть способ сделать это?

21

Решение

Похоже, вы ищете пустую лямбду, которая ничего не делает, так что ваш std::function объект всегда будет в вызываемом состоянии!

Если так, то используйте этот, который можно использовать повторно, для любого количества параметров:

static const struct empty_lambda_t //static and const applies to the object!
{
template<typename ...T>
void operator()(T && ... ) const {} //does nothing

}empty_lambda {}; //declare an object which is static and const

И затем используйте это как:

 std::function<void()>          fun1 = empty_lambda;
std::function<void(int,int)>   fun2 = empty_lambda;
std::function<void(whatever)>  fun3 = empty_lambda;

Надеюсь, это поможет.

33

Другие решения

в C ++ 14 будут «общие лямбды», которые должны упростить длинные имена типов в параметрах, как я понимаю:

auto lambda = [](auto x, auto y) {return x + y; };

Вот auto это как тип шаблона

http://en.wikipedia.org/wiki/C%2B%2B14#Generic_lambdas

11

Вы ищете «полиморфные лямбды». Их не существует (пока), поэтому нет.

Тем не менее, вы можете сделать это проще при правильном использовании typedefs, так что вам не нужно вводить всю вещь каждый раз.

1
По вопросам рекламы [email protected]