c – 重载运算符<< for arrays

前端之家收集整理的这篇文章主要介绍了c – 重载运算符<< for arrays前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想重载operator<<对于任意数组,使得代码cout<< my_arr会起作用.首先,我试图重载operator<<的第二个参数.在const T(& arr)[N]上,其中T和N是模板参数.但是测试代码会发现副作用: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 */
}

这样的阵列打印运算符是否仍然可以实现?

解决方法

当然:
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])
{
    // ...
}

这将使用SFINAE在T为char时禁用您的重载.

对于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; 
};

猜你在找的C&C++相关文章