我想编写一个函数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)
该代码可以正常工作,但是上一个规范中的条件太复杂了。
有什么解决方案可以简化最后一个?
对于默认情况,可以使用的一般方法是使用带有可变参数列表的函数。仅在没有其他功能匹配时使用。这是一个例子:
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)
对于仅两个重载,额外的功能可能不值得,但是当您获得更多重载时,此形式可以真正弥补默认情况。