C++ 印刷STL容器用于认证试验的公约
我正在使用优秀的库编写批准测试。该库自动生成函数结果的“快照”。快照是使用C++ 印刷STL容器用于认证试验的公约,c++,fmt,approval-tests,C++,Fmt,Approval Tests,我正在使用优秀的库编写批准测试。该库自动生成函数结果的“快照”。快照是使用ostream&operator将T类型的结果序列化到文件中生成的。我不知道打印容器的任何惯例或标准建议。但是,可以打印任何范围和元组之类的内容:因此您可以将其与ApprovalTests集成,并避免自己定义ostream插入运算符 免责声明:我是{fmt}的作者。所有容器都提供迭代器;使用一对迭代器的显示函数要比为每种容器类型手工连接不同的函数要好得多。一旦你编写了函数来展示你想要的东西,你就可以在每个容器中使用它。为了
ostream&operator将T
类型的结果序列化到文件中生成的。我不知道打印容器的任何惯例或标准建议。但是,可以打印任何范围和元组之类的内容:因此您可以将其与ApprovalTests集成,并避免自己定义ostream插入运算符
免责声明:我是{fmt}的作者。所有容器都提供迭代器;使用一对迭代器的显示函数要比为每种容器类型手工连接不同的函数要好得多。一旦你编写了函数来展示你想要的东西,你就可以在每个容器中使用它。为了安全起见,作为Rust,如果你既不拥有类也不拥有traits,你就不应该编写函数/traits。因此,operatorHi,代表我和Llewellyn Falco——ApprovalTests.cpp的两个维护者——非常感谢这个问题,以及其中真正有用的链接。。。我们不知道这些库中的大多数-我们会在可能的时候对它们进行实验,如果我们有任何有用的评论,我们会在这里回复…@PeteBecker你是对的,迭代器在生成简单项(如vector
或list
)时可以工作但是关于std::map
?@ClareMacrae我已经用你的库做了一些实验。在这里,我使用fmt自动格式化受支持的容器:这是一个测试项目:我专门化了StringUtils::toString,而不是实现操作符或为响应向您提供帮助。我已经使用fmt很长一段时间了,我非常感谢它来到了std。我正在尝试将它集成到ApprovalTests中。cpp:它似乎像预期的那样工作,这里有一个用它测试的示例项目:你有什么建议吗?非常酷。我唯一的建议就是尽量避免使用fmt/ostream.h
,除非绝对必要。是的,你是对的。在这种情况下,std::string
是返回类型,我可以使用format
而不是print
template <typename STREAM, typename T> STREAM& operator<<(STREAM& os, const std::vector<T>& vec) {
os << "[";
for (const auto& x : vec) {
os << x << ", ";
}
os << "]";
return os;
}
template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
using namespace std;
os << "[";
copy(v.begin(), v.end(), ostream_iterator<T>(os, ", "));
os << "]";
return os;
}
template <typename STREAM, typename T> STREAM& operator<<(STREAM& os, const std::vector<T>& vec) {
fmt::print(os, "[{}]", fmt::join(vec, ", "));
return os;
}
template <typename STREAM, typename T> STREAM& operator<<(STREAM& os, const std::vector<T>& vec) {
fmt::print(os, "{}", vec);
return os;
}
template <typename STREAM, typename T> STREAM& operator<<(STREAM& os, const std::vector<T>& vec) {
pprint::PrettyPrinter printer{os};
printer.print(vec);
return os;
}