加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 打印任何STL容器

发布时间:2020-12-16 05:44:48 所属栏目:百科 来源:网络整理
导读:如何编写一个库,当包含它时,它会超载任何*现有STL容器的运算符? 除了适配器,如堆栈和队列,因为您不能遍历它们. 一个自我强加的要求是它不能包含任何容器的头文件.这将不必要地膨胀最终的可执行文件.在我想要使用的容器之后添加这个标题是更有意义的.这种限
如何编写一个库,当包含它时,它会超载<<任何*现有STL容器的运算符?
>除了适配器,如堆栈和队列,因为您不能遍历它们.

一个自我强加的要求是它不能包含任何容器的头文件.这将不必要地膨胀最终的可执行文件.在我想要使用的容器之后添加这个标题是更有意义的.这种限制意味着使用模板或宏.

我正在寻找建议和指针,所以,请不要只是发布完整的工作代码,可以做到这一点!自己实现这一点是学习过程的一部分.欢迎演示某些事情如何工作的小代码片段.

我到目前为止做了什么

我已经超载了<运算符对每个具有不同模板签名的容器.我使用这种方法遇到的问题是,有一些容器具有相同数量的模板参数,但有些包含std :: pair-s,其他单个值.更准确地说,这是std :: map& std :: multimap vs std :: unordered_set&的std :: unordered_multiset. 这种冲突迫使我要么实现一个对的非模板版本,要么提出一种区分std :: pair-s和单个值的方法.不过我不知道如何去做第二个.原因是因为我直接不是“如何做”,我开始相信,这可以通过更好的整体设计来避免. 先谢谢你! 对我有用:
>重载运算符<<对于std :: pair
>重载运算符<<对于具有不同模板参数的每个STL容器

Note:

  1. template <typename T1> and template <typename T1,typename T2> are different
  2. template <typename T1,typename T2> and template <typename T1,size_t T2> are
    different
  3. template <typename T1,typename T2> and template <typename C1,typename C2>
    are NOT different

>将它们放在命名空间中,以确保您的运算符不会与将来可能需要的任何其他运算符相冲突.

在模板中使用“模板”,所以例如一个函数看起来像:

template <typename Type,template <typename TYPE> class TClass>
void func(TClass<Type>& tc) {
    if (tc.somethingTrue())
        tc.doStuff();
}

解决方法

您可以重载运算符<<作为一个采用模板模板参数(即任何容器)的模板. 那么你可以提供两个重载模板功能(例如打印),一个重载将专门用于std :: pair.
template<typename T>
std::ostream& print(std::ostream &out,T const &val) { 
  return (out << val << " ");
}

template<typename T1,typename T2>
std::ostream& print(std::ostream &out,std::pair<T1,T2> const &val) { 
  return (out << "{" << val.first << " " << val.second << "} ");
}

template<template<typename,typename...> class TT,typename... Args>
std::ostream& operator<<(std::ostream &out,TT<Args...> const &cont) {
  for(auto&& elem : cont) print(out,elem);
  return out;
}

LIVE DEMO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读