C++:举例说明如何使用enable_if和模板的函数指针参数

下面的这个例子主要实现如下功能:

  1.  当参数为数据类型时,调用std::to_string()方法将数值转化为字符串并输出。
  2.  当参数为std::string类型时,直接使用std::string的值输出。
  3.  当参数为对象时,如果对象中含有std::string str()方法,则调用对象的std::string str()方法;
  4.  如果对象不含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()函数

参考文档

SFINAE and enable_if

猜你喜欢

转载自blog.csdn.net/netyeaxi/article/details/83445372