c – 重载运算符<< for arrays

c – 重载运算符<< for arrays,第1张

概述我想重载operator<<对于任意数组,使得代码cout<< my_arr会起作用.首先,我试图重载operator<<的第二个参数.在const T(& arr)[N]上,其中T和N是模板参数.但是测试代码会发现副作用:const char []也匹配类型规范,新的重载与流类中定义的重载冲突.示例代码: #include <cstddef>#include <iostream>templ 我想重载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&>::typeoperator<<(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 – 重载运算符<< for arrays全部内容,希望文章能够帮你解决c – 重载运算符<< for arrays所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239302.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存