Ich benutze boost :: fusion.Eine Folge von Sequenzen (von Sequenzen) abflachen
Lets sagen, ich habe so etwas wie die folgenden:
make_vector(1, make_vector('b', 3, make_vector(4, 5.5), "six"), 7, 8)
Ich möchte eine Funktion f erzeugen, so dass
f(make_vector(1, make_vector('b', 3, make_vector(4, 5.5), "six"), 7, 8))
-> [1, 'b', 3, 4, 5.5, "six", 7, 8]
das heißt eine abgeflachte Version der Sequenz.
Ich habe nichts dagegen, wenn dies eine Ansicht der ursprünglichen Sequenz oder eines tatsächlichen Vektors ist.
Ich habe keine Lösung in C++ 0x, wenn es auf GCC 4.5.1 kompilieren kann.
Hinweis:
Während ich nicht lieber die Datenelemente beschränken, wenn es hilft, können Sie zu verlangen, dass die „Daten“ alle Elemente von einer gemeinsamen Basisklasse ableiten.
heißt
class DataBase {}
template <class T>
class Data : public DataBase
{
public:
Data(const T& x) : m_x(x)
T m_x;
}
template <class T>
T make_data(const T& x) { return Data<T>(x); }
Dann
make_vector(
make_data(1),
make_vector(
make_data('b'),
make_data(3),
make_vector(
make_data(4),
make_data(5.5)
),
make_data("six")
),
make_data(7),
make_data(8)
)
ich meine, dann können Sie herausfinden, was die Datenelemente unter Verwendung von "is_base_of" sind.
WOW! Danke, ich werde es versuchen und genauer hinsehen. Das sieht sehr nach dem Boost Quellcode aus, den ich gerade durchsucht habe. Ich habe meine Idee auch von der Haskell-Version abgeleitet, aber ich konnte die Berechtigung enable_if nicht ohne Kompilierungsfehler erhalten. – Clinton