compile-time objektauswahl?
-
konzeptionell benötige ich so etwas:
// #inlcude benötigte mpl-header using namespace boost::mpl; template<long n, typename T0, typename T1, typename T2, typename T3> typename at_c< vector< T0, T1, T2, T3 >, n >::type return_nth(const T0& t0, const T1& t1, const T2& t2, const T3& t3) { switch ( n ) { case 0: return t0; case 1: return t1; case 2: return t2; case 3: return t3; }; }das geht so nat. nicht - ich könnte das ganze durch overloading erreichen, das möchte ich aber unbedingt vermeiden - immerhin brauche ich das ganze bereits für eine beliebige anzahl von argumenten (4 ist hier nur ein beispiel), so das allein dadurch eine menge overloads existieren. irgendwelche ideen, wie das elegant zu lösen wäre?
-
Hmm, wenn du mit dem zurückgegebenen Objekt dann noch (sinnvoll) arbeiten willst, müssen {T(n)} eh in einer Hierarchie sein, was das ganze doch ein wenig abwandelt. Variable Argumentzahl kannst du glaub ich knicken, das klappt mit C++ nicht.
Könntest du vielleicht den Kontext erläutern?
-
machs komplett anders
-
mit ein bischen nachdenken bin ich darauf gekommen:
// #include benötigte mpl-header using namespace boost::mpl; struct dummy {}; // um kollisionen mit void* als parameter zu vermeiden template<long N, typename T0, typename T1, typename T2, typename T3> typename at_c< vector< T0, T1, T2, T3 >, n >::type return_nth(const T0& t0, const T1& t1, const T2& t2, const T3& t3, typename boost::enable_if_c< N != 0, dummy >::type* = 0) { return return_nth< N - 1 >( t1, t2, t3, t0 ); // oder auch return_nth< N - 1 >( t1, t2, t3 ); wenn die entsprechenden overloads existieren } template<long N, typename T0, typename T1, typename T2, typename T3> T0 return_nth(const T0& t0, const T1& t1, const T2& t2, const T3& t3, typename boost::enable_if_c< N == 0, dummy >::type* = 0) { return t0; }das wären dann jeweils 2 overloads je parameterzahl - das erscheint vertretbar. für das erzeugen der variablen parameteranzahlen ist der präprozessor zuständig.