Übergeben von der lädervergesselten Initialisiererliste mit mehreren Typen, die funktionieren, um zu funktionierenC++

Programme in C++. Entwicklerforum
Anonymous
 Übergeben von der lädervergesselten Initialisiererliste mit mehreren Typen, die funktionieren, um zu funktionieren

Post by Anonymous »

Wie kann eine aus der leichten verkürzte Initialisierer mit mehreren Typen an eine Funktion übergeben werden? < /p>
Ich versuche, den folgenden Code funktionieren zu

Code: Select all

#include 

template 
void g(std::tuple args) {}

int main() {
g({1, 'a', 0.4});                     // does not work
g({1, 'a', 0.4});  // works
g(std::tuple{1, 'a', 0.4});           // works
}
Ich möchte, dass die Zeile G ({1, 'a', 0.4}); funktioniert, ohne es zu bearbeiten. Der Compiler (G ++ 11.3.0) sagt, dass er nicht in std :: tuple
Dies ist bereits überraschend, weil ich erwartet hatte, dass der Typ std :: tuple . Weitere Untersuchungen haben gezeigt, dass der Compiler in der Lage ist, den Typ eines std :: initializer_list in Folgendes korrekt abzuleiten: < /p>

Code: Select all

#include 

template 
void f(std::initializer_list arg) {}

int main() {
f({1, 2, 3});                       // works
f({1, 2, 3});                  // works
f(std::initializer_list{1, 2, 3});  // works
}
< /code>
Dies ist dem eigentlichen Ziel sehr nahe, aber es funktioniert nur, wenn die Typen der Objekte in der Liste gleich sind. Mein erster Ansatz war es, die Implementierung von std :: initializer_list zu betrachten und sie selbst zu implementieren, aber ich scheine nicht einmal das F ({1, 2, 3}) zu erhalten. 
Zeile, die mit meiner eigenen Implementierung von Initializer_List funktioniert. Nur F ({1, 2, 3}); funktioniert mit meiner Initializer_List. Die Fragen sind also: < /p>

Ist es möglich, Ihre eigene init_list so f ({1, 2, 3}) zu implementieren. 0.4}); Arbeit?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post