2013-07-18 3 views
5

У меня есть следующий шаблон:перегрузка шаблонных функций для всех типов Струнных

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

, и я хотел бы, чтобы переопределить его поведение за все, что может быть превращено в std::string.

Оба указания явной специализации шаблона и функция перегрузки нешаблонной с параметром как std::string работать только для вызовов, которые Передавайте std::string, а не другие функций, так как это, кажется, приведение их в соответствии с шаблоном, прежде чем аргумент преобразование.

Есть ли способ достичь желаемого поведения?

ответ

9

Нечто подобное этом случае вам помощь в 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

И, конечно же, вы можете реализовать его вручную, если у вас нет C++ 11, или использовать импульс.

Смежные вопросы