2013-07-18 16 views
5

Mam następujący szablon:przeciążeniem Funkcja szablonowe dla wszystkich typów String

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

i chciałbym, aby zastąpić jego zachowanie do niczego, które mogą być zamienione na std::string.

Zarówno określenie jawnej specjalizacji szablonu, jak i przeciążenie funkcji innej niż szablon z parametrem jako std::string działa tylko w przypadku wywołań, które przechodzą w std::string, a nie w innych funkcjach, ponieważ wydaje się dopasowywać je do szablonu przed próbą argumentu konwersja.

Czy istnieje sposób na osiągnięcie pożądanego zachowania?

Odpowiedz

9

Coś w tym przypadku pomóc w 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

I oczywiście, można go realizować ręcznie, jeśli nie masz C++ 11, lub wykorzystać impuls.

Powiązane problemy