2013-07-18 7 views
5

Ich habe die folgende Vorlage:Überlastung Templated Funktion für alle String-Typen

template<class T> 
void fn(T t){ } 

und ich möchte ihr Verhalten für irgendetwas außer Kraft zu setzen, die zu std::string umgewandelt werden können.

Sowohl eine explizite Template-Spezialisierung und eine Nicht-Template-Funktion Überlastung mit dem Parameter als std::string Angabe nur für Anrufe arbeiten, die in einer std::string und nicht anderen Funktionen übergeben, da es sie an die Vorlage zu sein scheint passend, bevor Argument versuchen Umwandlung.

Gibt es eine Möglichkeit, das gewünschte Verhalten zu erreichen?

Antwort

9

So etwas wie diesem Fall helfen Ihnen in C++ 11

#include <type_traits> 
#include <string> 
#include <iostream> 

template<class T> 
typename std::enable_if<!std::is_convertible<T, std::string>::value, void>::type 
fn(T t) 
{ 
    std::cout << "base" << std::endl; 
} 

template<class T> 
typename std::enable_if<std::is_convertible<T, std::string>::value, void>::type 
fn(T t) 
{ 
    std::cout << "string" << std::endl; 
} 

int main() 
{ 
    fn("hello"); 
    fn(std::string("new")); 
    fn(1); 
} 

live example

Und natürlich Sie es manuell erkennen können, wenn Sie keine C 11 ++ haben oder Boost verwenden.

Verwandte Themen