2012-10-11 6 views
5

Angenommen:Ist es möglich, die Elemente eines Member-Arrays abhängig von einem integralen Template-Parameter zu konstruieren?

template<class T,int N> 
struct A { 
    A(): /* here */ {} 

    T F[N]; 
}; 

ich die Elemente F[] müssen mit {0,1,2,...,N-1} gebaut werden. Wenn möglich, möchte ich rekursiv definierte Template-Strukturen vermeiden, indem ich die letzte Ebene als template<class T> struct A<T,0> definiere und einige komplizierte Template-Tricks mache. Können C++ 11 Initialisierungslisten helfen?

Dies ist ähnlich Template array initialization with a list of values, aber es baut nicht die Elemente mit dem steigenden Wert. Es setzt es später in einer Laufzeitschleife.

+0

warum kann hier nicht Array verwendet werden ? – Jagannath

+0

Es kann, aber löst dieses Problem nicht – ritter

Antwort

2

eine Art indices Lösung Unter der Annahme, steht zur Verfügung:

A(): A(make_indices<N>()) {} 

// really a private constructor 
template<int... Indices> 
explicit A(indices<Indices...>) 
    // Can be an arbitrary expression or computation, too, like 
    // (Indices + 3)... 
    : F {{ Indices... }} 
{} 

Wenn Ihr Compiler zum Delegieren von Konstrukteuren nicht unterstützt, eine Option zu std::array<T, N> wechseln ist und einen privaten static Helfer verwenden, die eine initialisierte Array zurückgibt, wie dass der Standardkonstruktor würde:

A(): F(helper(make_indices<N>())) {} 

Dies würde natürlich eine zusätzliche (Bewegung) Konstruktion führen.

+0

[Komplette Demo auf LWS] (http://liveworkspace.org/code/9894e8cb01d5f7af1bbbef5e04397a16). –

+0

Das ist sehr cool! – ritter

+0

Ist das 'using' völlig notwendig? Mein Compiler GCC 4.6 versteht es nicht – ritter

4

Sie können mit einer Delegation variadische Wert Vorlage und Konstruktor dies tun:

template<int... I> struct index { 
    template<int n> using append = index<I..., n>; }; 
template<int N> struct make_index { typedef typename 
    make_index<N - 1>::type::template append<N - 1> type; }; 
template<> struct make_index<0> { typedef index<> type; }; 
template<int N> using indexer = typename make_index<N>::type; 

template<class T, int N> 
struct A { 
    template<T...I> A(index<I...>): F{I...} {} 

    A(): A(indexer<N>{}) {} 

    T F[N]; 
}; 

Dieser die Sequenz Pack Generator Calling a function for each variadic template argument and an array aus verwendet

+0

Ist die Verwendung von 'using' wesentlich für die Lösung? – ritter

+0

@Frank nein, es kann immer durch 'typedef' ersetzt werden. Es ist einfach in diesem Fall bequem. – ecatmur

+0

Ich habe gewählt - ich liebe, wie Vorlagen im neuen Standard völlig unlesbar sein können ;-) –

Verwandte Themen