0

Im eine rekursive Template-Funktion zu schaffen versucht, allerdings halte ich den Fehler bekommen:Variadische Vorlage Argument Abzug/Substitution fehlgeschlagen, Metaprogrammierung

no matching function for call to meuPrint(int&, Separator&, string&)

während auch empfangen:

candidate: template string meuPrint(U ..., Separator&,string&).

struct Separator {};  

template<class ...U> 
string meuPrint(U ...b , Separator &placeholder , string& text) 
{//end 
    char buffer[200]; 
    sprintf(buffer , text.c_str() , b...); 
    return buffer; 
} 
template<class ...T, class ...U> 
string meuPrint(U ...b , Separator &placeholder , string& text , string value , T ...a) 
{//string 
    return meuPrint(b... , to_lower(value) , placeholder , text , a...); 
} 

template<class V, class ...T, class ...U> 
string meuPrint(U ...b , Separator &placeholder , string& text , V value , T ...a) 
{//middle 
    return meuPrint(b... , value , placeholder , text , a...); 
} 

template<class ...T> 
string meuPrint(std::string _text , T ...a) 
{//start 
    Separator placeholder; 
    return meuPrint(placeholder , _text , a...); 
} 

int main(int n , char** args) 
{ 
    string o = meuPrint( string("hello %i world") , 8); 
    std::cout << o << std::endl; 
    return 0; 
} 

Die Ziel hier ist nicht unbedingt die Kleinschreibung der Parameter, sondern ein Konzept zu testen. Ich verstehe nicht, warum der Compiler es versäumt, abzuleiten, während er mir später einige gültige Kandidaten nennt.

Antwort

0

So etwas kann

template<class V, class ...T, class ...U> 
string meuPrint(U ...b , Separator &placeholder , string& text , V value , T ...a) 

Daumenregel nicht: Sie nur eine Packung Argument haben kann, die am Ende der Liste der Argumentation sein müssen.

So kann man vernünftigerweise schreiben (und der Compiler ableiten kann) so etwas wie

template <typename V, typename ... T> 
string meuPrint(V value, T ... a) 

aber das Folgende

template <typename V, typename ... T> 
string meuPrint(T ... a, V value) 

Zwei Pack von Argumenten scheitern, wie folgt,

template <typename ... U, typename ... T> 
string meuPrint(U ... u, T ... t) 

kann nicht abgeleitet werden (wo ist die Grenze zwischen dem Paket u und dem Paket t?).

Wenn Sie zwei Sätze von Argumenten haben, müssen Sie sie mit etwas wie einem std::tuple sammeln; etwas wie

template <typename ... U, typename ... T> 
string meuPrint(std::tuple<U ...> u, std::tuple<T ...> t) 

aber die Verwendung von variadic Tupel kann ein wenig schwierig sein.

Off-Topic-Vorschlag: Sie verwenden C++ 11; nicht das alte C. Wegwerfen sprintf() und verwenden Sie die C++ - Streams Einrichtungen.

ist viel einfacher Gebrauch variadische Argumente mit Streams (das Format String ignorieren)

+0

diesem Grund habe ich diese Klasse „Separator“ zwischen variadische Variablen hatte, die Sie erwähnt mehrdeutigen Situationen wie die, die zu lösen. Aber es scheint den Gedanken nicht zu lösen. –

Verwandte Themen