当前位置: 首页 > 知识库问答 >
问题:

如何编写通用(模板)容器输出推杆

翟兴邦
2023-03-14

我正在努力跟上“现代”C的速度,特别是使用模板。我得到了一个班级分数,超过了

我的问题——有没有一种方法可以为多种容器类型编写类似于下面代码的模板?

template <typename T>
std::ostream& operator <<(ostream& os, const vector<T>& v)
{
  os << "\n";
  for( auto x : v ) { os << "\n\t" << x; }
  os << "\n";
  return os;
}

只要T有一个值,上面的代码就以多行格式正确输出向量

我还意识到,对于所有类型,以通用方式覆盖容器的输出可能是个坏主意(或者至少是不礼貌的)。因此,上面的模板代码最终会将typename硬编码/限制为“Point”和一个模板化容器。

好的,根据AndyG的建议,我有以下完整的代码:

#include <iostream>
#include <map>
#include <vector>

using namespace std;


struct Point {
  double x, y, z;

  Point() : x(0), y(0), z(0) {};
  Point(double a, double b, double c) : x(a), y(b), z(c) {}
  Point(double a[]) : x(a[0]), y(a[0]), z(a[0]) {}

  friend std::ostream& operator <<(ostream& os, const Point&p)
  {
    os << p.x << ", " << p.y << ", "<< p.z;
    return os;
  }

};

template <template<class> class C, class... T>
std::ostream& operator <<(ostream& os, const C<T...>& v)
{
  os << "\n";
  for( auto x : v ) { os << "\n\t" << x; }
  os << "\n";
  return os;
}

vector<Point> vp = { { 1, 2, 3 },
                     { 5, 7, 4 },
                     { 8, 2, 5 }
};

int main(int argc, char* argv[])
{
  cout << vp[0]; // works
  cout << vp;    // dosen't work,
}

但还是没有运气。编译器无法匹配运算符

我尝试了许多模板的变体

我不知道可变模板包,这显然是个好主意,但并不能解决问题。


共有1个答案

阎雪峰
2023-03-14

好的,安蒂格让我走上了正确的道路,我想我明白发生了什么。

下面的代码不起作用,因为std::container模板也有一个allocator参数,它有一个默认值,你很少需要使用它。因此,我们认为大多数容器模板只取它们将包含的类型/类。

这个啊

template < template <class> class C, class... T>
std::ostream& operator <<(ostream& os, const C<T...>& v)
{ ... }

不起作用,因为我们要在运算符中调用的模板C

这将有助于:

template < template <class, class> class C, class... T>
std::ostream& operator <<(ostream& os, const C<T...>& v)

因为编译器可以匹配向量

请注意,一般来说,这种方法存在许多错误。模板

我们可以通过使用varg参数:模板来解决这个问题

因此,虽然这对我更好地理解模板是一个有用的练习,但不要这样做。

这个链接有一个整洁的容器pretty print lib:pretty print C STL containers

 类似资料:
  • 问题内容: 标题输出很好,但是内容却没有。它里面有一些html,我得到了以下错误:像这样描述:http : //docs.angularjs.org/error/ $ sce:unsafe,这很好,但是那我怎么能在那里输出内容将在其中一些HTML,所以我必须将其设置为或smthn。正确的方法是什么? 编辑: AngularJS版本:1.2 问题答案: 因此解决方法是: 从http://code.a

  • 我能用Eval让它工作...但我们都知道eval是邪恶的。 有人能给我指点一下这方面的教程吗?除了简单的代币替换之外,我似乎找不到任何东西。

  • 问题内容: 我使用下面的代码可以正常工作,但是现在我想将模板打印到文件中,并尝试以下操作但出现错误 错误是: 问题答案: 使用数组作为第二个参数,而不是模板本身。 输出: 而且的内容是

  • 我有一些我需要的特定代码,为了能够有某些我不想每次都写的I/O东西,我只想能够添加一个Java类,这样它就已经有了那些代码,我试着做了: 基本上这个东西需要在xml中,但我不知道如何正确地编写它,我以为到处都写${filename}就可以了,但它不起作用。总而言之,我希望文件的名称写在我写“${filename}”的地方,我该怎么做呢?

  • 使用,我在基本模板中定义了一个,其中包含默认内容。在某些情况下,我希望这个块为空,所以我想我可以重新定义它的名称,并使它不包含以下内容: 不知何故,Go似乎认为这个定义是“零”,并且仍然会呈现默认内容,除非我将任何非空白内容放入定义中。 我在Golang repo上发现了这个问题,它在一个游乐场示例中很好地描述了同样的事情: 奇怪的是,这个问题提到它是固定的(如果我理解正确的话,它在1.8.1中着

  • 内容输出方法为:display() 将模板内容输出: $this->display(); //调用默认对应模板