5
我有以下模板:過載模板函數的所有字符串類型
template<class T>
void fn(T t){ }
,我想重寫其行爲對任何可以被轉換爲std::string
。
兩個規定明確的模板專業化與參數作爲std::string
一個非模板函數重載只爲傳遞一個std::string
而不是其他函數的調用工作,因爲它似乎在試圖論證之前他們匹配模板轉換。
有沒有辦法實現我想要的行爲?
我有以下模板:過載模板函數的所有字符串類型
template<class T>
void fn(T t){ }
,我想重寫其行爲對任何可以被轉換爲std::string
。
兩個規定明確的模板專業化與參數作爲std::string
一個非模板函數重載只爲傳遞一個std::string
而不是其他函數的調用工作,因爲它似乎在試圖論證之前他們匹配模板轉換。
有沒有辦法實現我想要的行爲?
事情是這樣的情況下,幫助您在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);
}
和當然,您也可以手動實現它,如果你沒有C++ 11,或者使用升壓。