2010-10-20 14 views
7

Ich bin auf der Suche nach einer hybriden Meta-Container/Container-Klasse. Ich möchte eine Klasse, die einen Kompilierzeittyp einem Laufzeitwert zuordnet. Ein Code-Snippit ist 1024 Wörter wert so:Ein std :: map wie Container, der Typen auf Werte abbildet

Das ist wirklich langweiliges Zeug. Eine Implementierung mit variadischen Vorlagen wäre interessant genug, aber die Schnittstelle ist sehr einfach.

Der Teil, der das schwieriger macht, ist das letzte Feature, das ich möchte.

void foo(const meta_constainer<Foo,Bar,Baz>& mc); 

//make_mc is sorta like make_pair or make_tuple. 

int main() 
{ 
    foo(make_mc(Foo(), Bar(), Baz())); // not really interesting 
    foo(make_mc(Bar(), Foo(), Baz())); // this is more challenging 
    foo(make_mc(Foo())); // this might be difficult as well. 
} 

Ich könnte so einen Container schreiben, aber ich würde gerne einen finden, der bereits geschrieben/debugged ist. Mein größter Stolperstein war Mangel an guten Schlüsselwörtern, nach denen zu suchen (heterogener Behälter ist nicht, was ich will).

Gibt es eine Boost-Bibliothek, die diese oder eine ähnliche Schnittstelle hat?

Wie heißt dieses Ding, damit ich es effektiver googlen kann?


Update:

ich nicht stehe auf:

  • boost::mpl::map
    Dieses bildet einen Compiler-Wert zu einem Kompilierung-Wert
  • std::map<*,boost::any>
    Dies ist ein Karten Laufzeitwert des statischen Typs zu einem Laufzeitwert des dynamischen Typs
  • std::map<*,boost::variadic<*>>
    Dies bildet einen statischen typisierten Laufzeitwert auf einen Variablentyp Laufzeitwert
  • std::map<typeid,boost::variadic<*>>
    Dies ist in der Nähe, was ich will, außer dass es RTTI verwendet, und es ist kein Compiler-Fehler, wenn mit dem falschen Typ abgerufen.

Antwort

3
+0

'boost :: Fusion :: Set' mehr tut, als ich will, und weniger, aber es ist das Beste, was ich bisher gesehen habe. Es erfordert die Reihenfolge der Parameter, so dass mein Beispiel für eine ungeordnete Liste nicht funktioniert. –

+0

hmm, ich hätte gedacht, Fusion :: Vektor ist was du suchst? Sie könnten das mit einem Enum kombinieren, um das zu erreichen, was Sie benötigen? – Nim

+0

'fusion :: set' erlaubt mir,' int' auf einen ganzzahligen Wert und 'float' auf einen Gleitkommawert abzubilden. 'fusion :: vector' bildet die Kompilierungszeit '0' auf einen ganzzahligen Wert ab und kompiliert '1' in einen Gleitkommawert. Ich könnte ein Hilfsmapping zwischen den '0',' 1' Konstanten und 'int',' float' machen, aber 'fusion :: set' macht das schon für mich. –

Verwandte Themen