当前位置:  开发笔记 > 编程语言 > 正文

打印任何STL容器

如何解决《打印任何STL容器》经验,为你挑选了2个好方法。

您将如何编写一个库,当包含它时,它会使任何*现有STL容器的<<运算符超载?

除了堆栈和队列之类的适配器,因为您无法遍历它们.

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

我正在寻找建议和指示,所以,不要发布能够做到这一点的完全正常工作的代码!自己实现这一点是学习过程的一部分.代码片段的小片段可以展示某些东西是如何工作的.

到目前为止我做了什么:

<<为每个具有不同模板签名的容器重载了运算符.我遇到的问题是,有些容器具有相同数量的模板参数,但有些容器包含std::pair-s,其他容器single values.更确切地说,这是std::map&std::multimapvs std::unordered_set&的情况std::unordered_multiset.

这次碰撞迫使我要么实现其中一对的非模板版本,要么想出一种区分std::pair-s和-s 的方法single values.不过,我真的不知道如何去做第二个.我之所以不直接" 怎么做 " 的原因是我开始相信这可以通过更好的整体设计来完全避免.

先感谢您!



什么对我有用:

    超载operator<<std::pair

    operator<<使用不同的模板参数重载每个STL容器

    注意:

      template 并且template 不同的

      template 并且template 不同的

      template template 不是不同

    将它们放在命名空间中以确保您的操作员不会与将来可能需要的任何其他操作员发生冲突.


使用"模板中的模板",例如,函数看起来像:

template  class TClass>
void func(TClass& tc) {
    if (tc.somethingTrue())
        tc.doStuff();
}

101010.. 6

您可以重载operator<<作为带有模板模板参数(即任何容器)的模板。

然后,您可以提供模板函数的两个重载(例如print),其中一个重载专门针对std::pair

template
std::ostream& print(std::ostream &out, T const &val) { 
  return (out << val << " ");
}

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

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

现场演示



1> 101010..:

您可以重载operator<<作为带有模板模板参数(即任何容器)的模板。

然后,您可以提供模板函数的两个重载(例如print),其中一个重载专门针对std::pair

template
std::ostream& print(std::ostream &out, T const &val) { 
  return (out << val << " ");
}

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

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

现场演示



2> Paul Evans..:

一个非常简单的尝试可以解决此问题,例如:

template  
void print_container(std::ostream& os, const T& container, const std::string& delimiter)  
{  
    std::copy(std::begin(container),   
              std::end(container),   
              std::ostream_iterator(os, delimiter.c_str())); 
}  

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有