Я хочу сократить лямбды следующего типа:
[] (SomeVeryLongTemplateType<int, float, char, std::string>, AnotherLongType) {};
Поскольку единственная причина этой лямбды — инициализация некоторого класса std::function<...>
member — он ничего не захватывает, у него нет имен аргументов, он ничего не возвращает, он ничего не делает.
Если операция сокращения выражается как функция от количества аргументов в сигнатуре, то я хочу, чтобы эта функция имела сложность O (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;
Надеюсь, это поможет.
в C ++ 14 будут «общие лямбды», которые должны упростить длинные имена типов в параметрах, как я понимаю:
auto lambda = [](auto x, auto y) {return x + y; };
Вот auto
это как тип шаблона
Вы ищете «полиморфные лямбды». Их не существует (пока), поэтому нет.
Тем не менее, вы можете сделать это проще при правильном использовании typedef
s, так что вам не нужно вводить всю вещь каждый раз.