Подтвердить что ты не робот

Есть ли способ сократить lambda-подпись С++ 11 в объявлении?

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

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

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

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

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

4b9b3361

Ответ 1

Похоже, вы ищете пустую лямбду, которая ничего не делает, так что ваш объект 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;

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

Ответ 2

в С++ 14 будет "generic lambdas", который должен упростить имена длинного типа в параметрах, как я понимаю:

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

здесь auto похож на тип шаблона

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

Ответ 3

Вы ищете "полиморфные лямбды". Они не существуют (пока), поэтому нет.

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