C ++ enable_if是否可以使用默认实现?

Sal*_*Egg 4 c++ templates

我想编写一个函数print,其功能根据其参数的类型而有所不同。

这是我的实现:

template <typename T, typename std::enable_if<std::is_array<T>::value, int>::type = 0>
void print(const T &v) {
  std::cout << "array: ";
  for (const auto &e : v) {
    std::cout << e << ", ";
  }
  std::cout << std::endl;
}

template <typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void print(const T &v) {
  std::cout << "integral: " << v << std::endl;
}

template <typename T, typename std::enable_if<!(std::is_array<T>::value || std::is_integral<T>::value), int>::type = 0>
void print(const T &v) {
  std::cout << "default: " << v << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

该代码可以正常工作,但是上一个规范中的条件太复杂了。

有什么解决方案可以简化最后一个?

Vau*_*ato 6

对于默认情况,可以使用的一般方法是使用带有可变参数列表的函数。仅在没有其他功能匹配时使用。这是一个例子:

template <typename T, typename std::enable_if<std::is_array<T>::value, int>::type = 0>
void print_helper(const T &v,int) {
  std::cout << "array: ";
  for (const auto &e : v) {
    std::cout << e << ", ";
  }
  std::cout << std::endl;
}

template <typename T, typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void print_helper(const T &v,int) {
  std::cout << "integral: " << v << std::endl;
}

template <typename T>
void print_helper(const T &v,...) {
  std::cout << "default: " << v << std::endl;
}

template <typename T>
void print(const T &v)
{
  print_helper(v,0);
}
Run Code Online (Sandbox Code Playgroud)

对于仅两个重载,额外的功能可能不值得,但是当您获得更多重载时,此形式可以真正弥补默认情况。