我想重载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_if
和is_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; };