2016-06-06 19 views
6

So habe ich eine Lambda des Rückgabetyp ist, ist auto und ich habe Probleme mit der Anordnung für ein initializer_list sichern hier zerstört:Lebensdauerverlängerung einer initializer_list Rückkehr

const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; }; 

Ich werde das Lambda verwenden wie dies:

auto bar = foo(1, 2, 3); 

for(const auto& i : bar) cout << i << endl; 

Ein Job, ich arbeite als Teil ihres Codierungsstandard hat, dass alle Lambdas einzelne Aussagen (fühlen sich frei, Ihre Empörung auszudrücken.) sind ich denke, dass ich dieses Problem umgehen kann:

  1. Geben foo ein Rückgabetyp vector int, aber das vermasselt, wie schön generic es ist: const auto foo = [](const auto& a, const auto& b, const auto& c) -> vector<int> { return {a, b, c}; }
  2. Nur eine templatized Funktion zu schreiben, die eine vector<T> konstruiert und gibt es: template <typename T> vector<T> foo(const T& a, const T& b, const T& c){ return {a, b, c}; }

Ist es möglich, um diese Variablen in einen Container zu zwingen, wer wird nicht alle in einer Zeile zerstört, so dass ich das Lambda mit einem auto Rückgabetyp behalten kann?

+1

Es ist keine 'Anfangs iizer_list', ist eine Initialisierungsliste. Zwei verschiedene Dinge. Es gibt nichts, woran man es ableiten könnte, weshalb es fehlschlägt. –

+1

Wie packen Sie die Rückgabe in Lambda als Tupel und entpacken sie als initializer_list in einen Container? – Arunmu

+0

Was passiert, wenn 'a',' b' und 'c' unterschiedliche Typen haben? – NathanOliver

Antwort

3

Die Bibliothek Grundlagen TS v2 hat std::experimental::make_array, die sicherlich Ihre Anforderungen erfüllen würde:

#include <experimental/array> 
const auto foo = [](const auto& a, const auto& b, const auto& c) { 
    return std::experimental::make_array(a, b, c); }; 

Allgemeiner template argument deduction for constructors Ihnen erlauben würde, schreiben:

const auto foo = [](const auto& a, const auto& b, const auto& c) { 
    return std::vector{a, b, c}; }; 
         ^-- no template parameter required 

Heute Sie diese emulieren könnte mit common_type:

const auto foo = [](const auto& a, const auto& b, const auto& c) { 
    return std::vector<std::common_type_t<decltype(a), decltype(b), decltype(c)>>{a, b, c}; }; 
+1

Oh Snap! Ich tat es nicht weiß, dass ich einen "Vektor" ohne spe deklarieren könnte cifying Art! –

+1

@ JonathanMee Sie können * noch * nicht, aber es gibt Hoffnung, dass Sie in C++ 17 sein können. – ecatmur

+1

Könnten Sie nicht einfach 'std :: vector {a, b, c}'?(Sieht aus wie diese Art von als Antwort hinzugefügt wurde, nachdem ich das geschrieben) – KABoissonneault