297 Stimmen

Können Lambda-Funktionen als Vorlage verwendet werden?

Gibt es in C++11 eine Möglichkeit, eine Lambda-Funktion als Vorlage zu verwenden? Oder ist sie von Natur aus zu spezifisch, um als Vorlage verwendet zu werden?

Ich verstehe, dass ich eine klassische Vorlage Klasse/Functor stattdessen definieren kann, aber die Frage ist mehr wie: erlaubt die Sprache Vorlage Lambda-Funktionen?

0 Stimmen

Gibt es einen Anwendungsfall, bei dem eine Lambda-Vorlage nützlich wäre?

13 Stimmen

James: Sie könnten eine Funktion erstellen, die über ein Tupel iteriert (nicht unbedingt nützlich).

0 Stimmen

Ich kam auf die Idee, als ich ein Interview von Stroustrup las, in dem er über die Komplexität von Meta-Templates sprach, die ein Problem darstellt. Wenn es erlaubt wäre, stellte ich mir den Ninja-Code-Fu vor, der von allzu cleveren Programmierern erfunden werden könnte, die mit dieser Funktionskombination spielen...

2voto

muaz Punkte 470

Eine weitere Abhilfe für C++11 besteht darin, eine Vorlagenfunktion zu definieren und sie in einen Lambda-Ausdruck einzuschließen. Dies erfordert jedoch die Definition einer neuen Funktion für verschiedene Vorlagen-Lambdas:

struct ST{ int x; };

template<class T>
T templateFunc(T variable)
{
    return variable;
}

void func()
{
    ST st{10};
    auto lambda = [&](){return templateFunc<ST>(st);};
    auto res = lambda();
}

1voto

rmccabe3701 Punkte 1348

Hier ist eine Lösung, bei der das Lamba in eine Struktur eingewickelt wird:

template <typename T>                                                   
struct LamT                                                             
{                                                                       
   static void Go()                                                     
   {                                                                    
      auto lam = []()                                                   
      {                                                                 
         T var;                                                         
         std::cout << "lam, type = " << typeid(var).name() << std::endl;
      };                                                                

      lam();                                                            
   }                                                                    
};   

Zu verwenden:

LamT<int>::Go();  
LamT<char>::Go(); 
#This prints 
lam, type = i
lam, type = c

Das Hauptproblem dabei ist (neben der zusätzlichen Typisierung), dass Sie diese Strukturdefinition nicht in eine andere Methode einbetten können, sonst erhalten Sie (gcc 4.9)

error: a template declaration cannot appear at block scope

Ich habe auch dies versucht:

template <typename T> using LamdaT = decltype(                          
   [](void)                                                          
   {                                                                 
       std::cout << "LambT type = " << typeid(T).name() << std::endl;  
   });

Mit der Hoffnung, dass ich es so nutzen kann:

LamdaT<int>();      
LamdaT<char>();

Aber ich erhalte den Compilerfehler:

error: lambda-expression in unevaluated context

Das funktioniert also nicht ... aber selbst wenn es sich kompilieren ließe, wäre es von begrenztem von begrenztem Nutzen, weil wir immer noch das "using LamdaT" in den Dateiscope setzen müssten (weil es sich um eine Vorlage handelt), was den Zweck von Lambdas in gewisser Weise zunichte macht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X