Может ли общая лямбда не иметь аргументов?
Прежде всего, я знаю, что могу использовать шаблонный класс/функтор, но это не то, что я хочу.
Вот лямбда:
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
};
Ответы
Ответ 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
Нет, общая лямбда не может иметь никаких аргументов, потому что у нее нет аргументов для вывода типа. Вам придется использовать шаблонный шаблонный функтор.