0

Im essayant de créer une fonction de modèle récursif, mais je continue à obtenir l'erreur:déduction/substitution argument modèle VARIADIC a échoué, Méta

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

tout en recevant:

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; 
} 

Le but ici n'est pas nécessairement de minuscules les paramètres, mais de tester un concept. Je ne comprends pas pourquoi le compilateur ne parvient pas à déduire tout en me disant quelques candidats valables par la suite.

Répondre

0

Quelque chose comme ça ne peut pas fonctionner

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

Règle générale: vous ne pouvez avoir qu'un pack d'argument qui doit être à la fin de la liste des arguments.

Vous pouvez donc raisonnablement écrire (et le compilateur peut déduire) quelque chose comme

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

mais ce qui suit échouerez

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

Deux paquet d'arguments, comme suit,

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

ne peut pas être déduit (où est la limite entre le pack u et le pack t?).

Si vous avez deux packs d'arguments, vous devez les collecter avec quelque chose comme std::tuple; quelque chose comme

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

mais l'utilisation de tuples variadiques peut être un peu difficile.

Off Suggestion de sujet: vous utilisez C++ 11; pas le vieux C. Jetez sprintf() et utilisez les installations de flux C++. pour résoudre des situations ambiguës comme celles que vous avez mentionnées

est beaucoup plus simple l'utilisation des arguments variadique avec des flux (vous pouvez ignorer la chaîne de format)

+0

Voilà pourquoi j'avais cette classe « Separator » entre les variables variadique,. Mais cela ne semble pas résoudre sa pensée. –