2013-07-18 62 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,或者使用升壓。