我正在努力跟上“现代”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,
}
但还是没有运气。编译器无法匹配运算符
我尝试了许多模板的变体
我不知道可变模板包,这显然是个好主意,但并不能解决问题。
好的,安蒂格让我走上了正确的道路,我想我明白发生了什么。
下面的代码不起作用,因为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(); //调用默认对应模板