重载运算符<< for arrays

And*_*rov 7 c++ iostream operator-overloading

我想重载operator<<任意数组,以便代码cout << my_arr可以工作.首先,我尝试重载operator<<on 的第二个参数const T (&arr)[N],其中TN是模板参数.但是测试代码会发现副作用:const char[]也匹配类型规范,新的重载与流类中定义的重载冲突.示例代码:

#include <cstddef>
#include <iostream>

template<typename T, std::size_t N>
std::ostream& operator<<(std::ostream& os, const T (&arr)[N])
{
    /* do stuff */
    return os;
}

int main()
{
    std::cout << "noooo\n"; /* Fails: ambiguous overload */
}
Run Code Online (Sandbox Code Playgroud)

这样的阵列打印操作员是否仍然可以实现?

Geo*_*che 5

当然:

template<typename T, std::size_t N>
typename std::enable_if<!std::is_same<T, char>::value, std::ostream&>::type
operator<<(std::ostream& os, const T (&arr)[N])
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这将在禁用过载Tchar使用SFINAE.

对于C++ 03,Boost有enable_ifis_same.或者只是滚动你自己:

template<class T, class U> struct is_same { 
    enum { value = false }; 
};
template<class T> struct is_same<T, T> { 
    enum { value = true }; 
};

template<bool, class T> struct enable_if {};
template<class T> struct enable_if<true, T> { 
    typedef T type; 
};
Run Code Online (Sandbox Code Playgroud)