C++ 重载所有字符串类型的模板函数

C++ 重载所有字符串类型的模板函数,c++,template-specialization,overloading,C++,Template Specialization,Overloading,我有以下模板: template<class T> void fn(T t){ } 模板 void fn(T){} 我想覆盖它的行为,任何可以转换成std::string的东西 将参数指定为std::string的显式模板专门化和非模板函数重载仅适用于传入std::string的调用,而不适用于其他函数,因为它似乎在尝试参数转换之前将它们与模板匹配 有没有一种方法可以实现我想要的行为?类似的例子可以帮助您在C++11中使用 #include <type_traits>

我有以下模板:

template<class T>
void fn(T t){ }
模板
void fn(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);
}
#包括
#包括
#包括
模板
typename std::enable_if::value,void>::type
fn(T)
{
标准::cout