我有以下模板:
template<class T>
void fn(T t){ }
我想为任何可以转换为std::string
.
使用参数指定显式模板特化和非模板函数重载std::string
都只适用于传入 anstd::string
而不是其他函数的调用,因为它似乎在尝试参数转换之前将它们与模板匹配。
有没有办法实现我想要的行为?
我有以下模板:
template<class T>
void fn(T t){ }
我想为任何可以转换为std::string
.
使用参数指定显式模板特化和非模板函数重载std::string
都只适用于传入 anstd::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,你可以手动实现它,或者使用 boost。