2015-03-01 17 views
5

Sono nuovo ai modelli e metaprogrammazione in C++. Quello che sto cercando di fare ora è il seguente: Ho una struct con un modello che prevede non-tipo confezione variadic di tipo char, definito banalmente come segue:C++ combinando il modello degli argomenti metaprogramming

template <char ... chs> 
struct MyStruct 
{}; 

Ho un secondo modello di struct che si aspetta due tipi, come questo:

template <typename ch1, typename ch2> 
struct Together 
{ 

}; 

Quello che sto cercando di realizzare è:

cout << Together<MyStruct<'a','b'>, MyStruct<'c','d'>>::result << '\n'; 

che deve stampare: ABCD

Grazie in anticipo

+4

Dal momento che le persone che rispondono alla domanda sembrano avere diverse interpretazioni di che cosa esattamente vuoi sapere: quale aspetto hai problemi con? Concatenare i due pacchetti di parametri o convertire un pacchetto di parametri 'char ...' in una stringa? Avrebbe notevolmente migliorato la tua domanda se avessi mostrato quali aspetti * non * avessero bisogno di una risposta. – hvd

+0

Concatenazione di due pacchetti di parametri in fase di compilazione –

risposta

3

Con i modelli, è possibile ottenere la corrispondenza del modello tramite la specializzazione parziale. Dichiarare una dichiarazione modello primario in questo modo:

template <typename First, typename Second> 
struct Together; 

e quindi definire una specializzazione parziale per i tipi con "look" in un certo modo:

template <char... ch1s, char... ch2s> 
struct Together<MyStruct<ch1s...>, MyStruct<ch2s...>> 
{ 
    std::string result; 
    Together() : result({ch1s..., ch2s...}){} 
}; 
1

Questa è una possibile soluzione che si avvicina la questione utilizzando un risultato std :: string:

template <char ... chs> 
struct MyStruct 
{ 
    static string stringify() 
    { 
     return stringify(chs...); 
    } 

    template <typename ... cst> 
    static string stringify() 
    { 
     return string(); 
    } 

    template <typename T, typename ... cst> 
    static string stringify(T c, cst... cs) 
    { 
     return string() + c + stringify<cst...>(cs...); 
    } 
}; 

template <typename ch1, typename ch2> 
struct Together 
{ 
    static string result() {return ch1::stringify() + ch2::stringify();} 
}; 

int main() { 
    cout << Together<MyStruct<'a','b'>, MyStruct<'c','d'>>::result() << '\n'; 
    return 0; 
} 

sarà del lavoro del corso con i parametri di modello più o meno, come questo:

Together<MyStruct<'a','b','c','d'>, MyStruct<'e','f','g'>>::result() 
0

Qui è un un piccolo miglioramento della answer s' il @Ryan Haining:

template <char... Chars> 
struct MyStruct 
{ 
    static constexpr char value[] {Chars..., '\0'}; 
}; 

template <char... Chars> 
constexpr char MyStruct<Chars...>::value[]; 

template <typename, typename> 
struct Together; 

template <char... Chars1, char... Chars2> 
struct Together<MyStruct<Chars1...>, MyStruct<Chars2...>> 
{ 
    using type = MyStruct<Chars1..., Chars2...>; 
}; 

Live demo

Problemi correlati