And*_*rov 7 c++ iostream operator-overloading
我想重载operator<<任意数组,以便代码cout << my_arr可以工作.首先,我尝试重载operator<<on 的第二个参数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 */
}
Run Code Online (Sandbox Code Playgroud)
这样的阵列打印操作员是否仍然可以实现?
当然:
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)
这将在禁用过载T时char使用SFINAE.
对于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;
};
Run Code Online (Sandbox Code Playgroud)