c++ - tipos - ¿Puede un lambda genérico no tener argumentos?
tipos de argumentacion (5)
De hecho, en C ++ 14 puede crear "plantillas lambdas" usando exactamente la sintaxis que desea, pero solo en el ámbito del espacio de nombres:
// (1)
template <typename T>
auto l = [] () {
T x;
};
int main() {
l<int>();
}
No es un lambda genérico, es una plantilla variable, pero incluso puedes crear el lambda genérico:
template <typename T>
auto l = [] (auto y) {
T x = 42;
std::cout << x + y << std::endl;
};
Pero hay un inconveniente: parece que entre los compiladores actuales solo Clang apoya esto.
Actualización : ya que esto solo se puede hacer en el ámbito del espacio de nombres, si su lambda no tiene argumentos, o no tiene argumentos auto
(es decir, no es genérico), puede ser reemplazado por una función sin requerir siquiera C ++ 11 características, sin mencionar C ++ 14. Si dicha lambda tiene capturas, solo pueden capturar variables globales, por lo que la función correspondiente solo puede usar las mismas variables o sus copias. Gracias a @JasonR por señalar esto:
// effectively the same as (1)
template <typename T>
void l() {
T x;
}
En primer lugar, sé que podría usar una clase / functor con plantilla, pero no es lo que quiero.
Aquí está la lambda:
auto lambda = [] (auto var) {
decltype(var) x;
//do stuff with x but nothing with var
};
El problema es que recibo la advertencia C4100 (parámetro formal sin referencia). También sé que podría usar trucos como deshabilitar la advertencia y habilitarla nuevamente después de la lambda o usar macros como UNREFERENCED_PARAMETER, pero eso es hacer trampa.
¿Hay alguna manera de que pueda lograr eso?
Un código ideal se vería así:
template <typename T>
auto lambda = [] () {
T x;
//do stuff with x
};
Esto no es para lo que están los lambdas, y no hay sintaxis para hacerlo (aparte de cortar la advertencia).
Sólo escribe una plantilla de función adecuada. No todo tiene que ser un lambda.
No utilice lambda:
template<typename T>
struct Functor
{
void operator () () { T var; ... }
}
Un lambda no es otra cosa, un compilador generado funtor.
No, un lambda genérico no puede tener argumentos porque no tiene argumentos para deducir un tipo. Tendrás que usar el funtor con plantilla de retroceso.
Si realmente no necesita el argumento, simplemente envuélvalo en void
:
auto lambda = [](auto var) {
(void)var; // now we used it - more or less
decltype(var) x;
/* whatever else */
};