c++函数模板参数类型限定

函数模板

函数模板可以实现对不同数据类型做统一操作,比如比较两个数据的大小:

template<typename T>
bool compare(T& a,T& b) {
  return a < b;
}

函数模板的调用

void main() {
  bool ret = compare<int>(5, 10);
  ret = compare<float>(5.0f, 10.0f);
}

函数模板参数类型限定

一个函数声明为了模板函数,那就意味着可以给该函数传入任意的参数类型,但是可能模板函数内部实现并不支持某些类型,此时我们就需要给模板函数做参数类型限定。比如如何实现上面的函数只支持int和short类型。

  • 方法1
template <typename T> struct Checker;
template <> struct Checker<int> { typedef int Type; };
template <> struct Checker<short> { typedef int Type; };

template <typename T>
bool compare(typename Checker<T>::Type a, typename Checker<T>::Type b) {
  return a < b;
}
  • 方法2
template<typename T>
typename std::enable_if<std::is_same<int, T>::value || std::is_same<short, T>::value, bool>::type
compare(T a, T b) {
  return a < b;
}

上面的 compare函数就只支持传入int和short类型了,如果传入其它参数类型就会报错,如float类型。