2017-06-13 15 views
6

Ich versuche, die folgendes zu tun:Template Funktion Überlastung für Typ einen Typ enthält

#include <iostream> 
#include <vector> 
#include <tuple> 
#include <list> 

template <typename T> 
void f(T t) { 
    std::cout << "1" << std::endl; 
} 

template <typename T, typename V> 
void f(T<std::tuple<V>> t) { 
    std::cout << "2" << std::endl; 
} 

int main() { 
    f(std::list<double>{}); // should use first template 
    f(std::vector<std::tuple<int>>{}); // should use second template 
} 

Was ist der einfachste Weg, dies in C++ 14 zu tun? Ich dachte, dass ich auf diese Weise eine Art Mustervergleich durchführen könnte, aber der Compiler wird es nicht haben.

Antwort

5

Der Vorlagenparameter T wird als Vorlagenname verwendet, daher sollte er als template template parameter deklariert werden. z.B.

template <template <typename...> class T, typename V> 
//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
void f(T<std::tuple<V>> t) { 
    std::cout << "2" << std::endl; 
} 

LIVE

+0

ich Ihre Antwort überprüft und es wird erfolgreich kompiliert, mindestens jedoch in MSVS 2017 CE, das zweite Problem oder Funktionsaufruf von der Hauptfunktion ‚OP ist nicht die zweite Version der Funktion Vorlage ist es in der Tat mit der 1st. Ich weiß nicht, ob das mit Compiler-Optimierungen zu tun hat oder nicht, aber ich denke, es ist etwas, dessen man sich bewusst sein muss. Andere als das; gute Antwort! –

+0

@FrancisCugler Ich habe es mit Clang und GCC versucht, beide funktionieren wie erwartet; [VS] (http://rexttester.com/SUHT22605) scheint den Typ "T" für die 2. Funktionsvorlage nicht abzuleiten, ich bin mir nicht sicher, es könnte ein Fehler sein. – songyuanyao

+0

Oh okay, weil ich am Ende fragte, dass als eine Frage hier gefunden: https://stackoverflow.com/questions/44511401/function-temple-overload-resolution –

Verwandte Themen