下面的这个例子主要实现如下功能:
- 当参数为数据类型时,调用std::to_string()方法将数值转化为字符串并输出。
- 当参数为std::string类型时,直接使用std::string的值输出。
- 当参数为对象时,如果对象中含有std::string str()方法,则调用对象的std::string str()方法;
- 如果对象不含std::string str()方法,则返回空字符串。
class Box {
public:
string str() {
return "yes";
}
};
class Bin {
public:
string str1() {
return "no";
}
};
template<typename T>
std::string str(T& t) {
cout << "1.---------------------" << endl;
return "null";
};
template<>
std::string str(string& t) {
cout << "2.---------------------" << endl;
return t;
};
template<typename T, string (T::*U)() = &T::str>
string str(typename std::enable_if<std::is_class<T>::value && !std::is_same<T, string>::value, T>::type& t) {
cout << "3.---------------------" << endl;
return t.str();
};
template<typename T>
string str(typename std::enable_if<std::is_arithmetic<T>::value, T>::type& t) {
cout << "4.---------------------" << endl;
return std::to_string(t);
};
int main() {
string s = "sddds";
cout << str<string>(s) << endl;
bool j = true;
cout << str<bool>(j) << endl;
int i = 1000;
cout << str<int>(i) << endl;
float f = 10.6f;
cout << str<float>(f) << endl;
Box b1;
cout << str<Box>(b1) << endl;
Bin b2;
cout << str<Bin>(b2) << endl;
return 1;
}
2.---------------------
sddds
4.---------------------
1
4.---------------------
1000
4.---------------------
10.600000
3.---------------------
yes
1.---------------------
null
先看一下上述代码中使用的std::enable_if
typename std::enable_if<std::is_arithmetic<T>::value, T>::type
表示如果T是数值类型,则使用T的类型
typename std::enable_if<std::is_class<T>::value && !std::is_same<T, string>::value, T>::type
表示如果T是类,并且T不是string类型,则使用T的类型
再看下模板的函数指针参数
template<typename T, string (T::*U)() = &T::str>
表示如果要使用此模板函数,则T必须含有std::string str()函数
参考文档