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

Может ли общая лямбда не иметь аргументов?

Прежде всего, я знаю, что могу использовать шаблонный класс/функтор, но это не то, что я хочу.

Вот лямбда:

auto lambda = [] (auto var) {
    decltype(var) x;

    //do stuff with x but nothing with var
};

Проблема в том, что я получаю предупреждение C4100 (необязательный формальный параметр). Я также знаю, что могу использовать трюки, такие как отключение предупреждения и включение его снова после лямбда или использование макросов, таких как UNREFERENCED_PARAMETER, но это обман.

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

Идеальный код будет выглядеть так:

template <typename T>
auto lambda = [] () {
    T x;

    //do stuff with x
};
4b9b3361

Ответ 1

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

// (1)
template <typename T>
auto l = [] () {
    T x;
};

int main() {
    l<int>();
}

Это не общая лямбда, это шаблон переменной, но вы даже можете создать общий шаблон lambda:

template <typename T>
auto l = [] (auto y) {
    T x = 42;
    std::cout << x + y << std::endl;
};

Демо

Но есть недостаток: кажется, что среди текущих компиляторов только Clang поддерживает это.

Обновить. Поскольку это можно сделать только в области пространства имен, если ваша лямбда не имеет аргументов или не имеет аргументов auto (то есть, она не является общей), это может быть заменяется функцией, не требующей даже каких-либо функций С++ 11, не говоря уже о С++ 14. Если такая лямбда имеет захваты, они могут захватывать только глобальные переменные, поэтому соответствующая функция может просто использовать одни и те же переменные или их копии. Спасибо @JasonR за это:

// effectively the same as (1)
template <typename T>
void l() {
    T x;
}

Ответ 2

Если вам действительно не нужен аргумент, просто оберните его в void:

auto lambda = [](auto var) {
    (void)var; // now we used it - more or less
    decltype(var) x;
    /* whatever else */
};

Ответ 3

Это не то, для чего нужны лямбды, и нет синтаксиса для этого (кроме взлома предупреждения).

Просто напишите правильный шаблон функции. Не все должно быть лямбдой.

Ответ 4

Не используйте лямбда:

template<typename T>
struct Functor
{
   void operator () () { T var; ... }
}

Лямбда - это не что иное, компилятор, сгенерированный функтором.

Ответ 5

Нет, общая лямбда не может иметь никаких аргументов, потому что у нее нет аргументов для вывода типа. Вам придется использовать шаблонный шаблонный функтор.