2017-08-12 1 views
1

würde Ich mag eine Sachen wie diese in c tun ++:Inline Array-Deklaration mit direktem Zugang in C++

for (int i = 0, i < 3; ++i) 
{ 
    const auto& author = {"pierre", "paul", "jean"}[i]; 
    const auto& age = {12, 45, 43}[i]; 
    const auto& object = {o1, o2, o3}[i]; 
    print({"even", "without", "identifier"}[i]); 
    ... 
} 

Hat jeder wissen, wie diese Art von Trick zu tun? Ich mache es viel in Python. Es hilft mir, Code gut zu faktorisieren.

+4

Das sieht aus wie ... eine schlechte Idee? Warum sollten Sie bei jeder Schleifeniteration ein Array erstellen, um jedes Mal ein anderes Element zu erhalten? Was ist falsch daran, 'authors = {" friedrich johann "," wolfgang "," martin "} zu deklarieren;' außerhalb der Schleife zuerst, und dann in der Schleife wählen Sie einfach const auto & author = authors [i]; '? –

+0

Sie haben Recht, das ist die Lösung. – user2443456

Antwort

2

Sieht aus wie Sie mit author, einen Vektor von benutzerdefinierten Klasse verwendet haben sollte age, object und whatever Attribute, steckte es in einen Vektor und tun Bereich for-Schleife über sie - das idiomatische in C++ wäre:

struct foo 
{ 
    std::string author; 
    int age; 
    object_t object; 
    whatever_t whatever; 
}; 

std::vector<foo> foos = { /* contents */ }; 

for(auto const& foo : foos) 
{ 
    // do stuff 
} 

Wenn Sie wirklich wollen, können Sie tun:

const auto author = std::vector<std::string>{"pierre", "paul", "jean"}[i]; 
//  ^not a reference 

aber ich bin nicht sicher, wie gut diese optimiert werden. Sie können diese Vektoren auch vor der Schleife deklarieren und die Referenzen beibehalten.

+0

Das Problem mit Bereich for-Schleife kommt, wenn Sie viele Arrays haben. – user2443456

1

Das Erstellen eines Objekts wie {"pierre", "paul", "jean"} führt zu einer Initialisierungsliste. Initialisierungsliste hat keinen Operator [] Why doesn't `std::initializer_list` provide a subscript operator?. Sie sollten also zu const auto& author = (std::vector<std::string>{"pierre", "paul", "jean"})[i]; konvertieren. Außerdem sollte das Referenzsymbol nicht vorhanden sein, da Sie ein temporäres Objekt erstellen und eine Referenz auf ein temporäres Objekt speichern.