这是我之前关于漂亮印刷STL容器的问题的后续行动,为此我们设法开发了一个非常优雅且完全通用的解决方案.
在下一步中,我想std::tuple<Args...>使用可变参数模板包含漂亮打印(因此这是严格的C++ 11).因为std::pair<S,T>,我只是说
std::ostream & operator<<(std::ostream & o, const std::pair<S,T> & p)
{
return o << "(" << p.first << ", " << p.second << ")";
}
Run Code Online (Sandbox Code Playgroud)
打印元组的类似结构是什么?
我已经尝试了各种模板参数堆栈解包,传递索引并使用SFINAE来发现我何时处于最后一个元素,但没有成功.我不会用破碎的代码给你带来负担; 问题描述有希望直截了当.基本上,我想要以下行为:
auto a = std::make_tuple(5, "Hello", -0.1);
std::cout << a << std::endl; // prints: (5, "Hello", -0.1)
Run Code Online (Sandbox Code Playgroud)
与前一个问题包含相同级别的通用性(char/wchar_t,pair delimiters)的加分点!
如果构造函数的执行顺序很重要,我如何使用std :: make_tuple?
例如,我猜A类的构造函数和类B的构造函数的执行顺序未定义为:
std::tuple<A, B> t(std::make_tuple(A(std::cin), B(std::cin)));
Run Code Online (Sandbox Code Playgroud)
在阅读了对该问题的评论后,我得出了这个结论
这就是说
template<typename... args>
std::tuple<args...> parse(std::istream &stream) {
return std::make_tuple(args(stream)...);
}
Run Code Online (Sandbox Code Playgroud)
实现具有未定义的构造函数的执行顺序.
更新,提供一些上下文:
为了给我想要做的更多背景,这里是一个草图:
我想在CodeSynthesis XSD二进制解析/序列化的帮助下从stdin中读取一些序列化对象.以下是如何完成此类解析和序列化的示例:example/cxx/tree/binary/xdr/driver.cxx
xml_schema::istream<XDR> ixdr (xdr);
std::auto_ptr<catalog> copy (new catalog (ixdr));
Run Code Online (Sandbox Code Playgroud)
我希望能够指定序列化对象具有的类的列表(例如,目录,目录,3个序列化对象的someOtherSerializableClass)并将该信息存储为typedef
template <typename... Args>
struct variadic_typedef {};
typedef variadic_typedef<catalog, catalog, someOtherSerializableClass> myTypes;
Run Code Online (Sandbox Code Playgroud)
并在解析完成后找到一种方法来使用std :: tuple.草图:
auto serializedObjects(binaryParse<myTypes>(std::cin));
Run Code Online (Sandbox Code Playgroud)
其中serializedObjects将具有该类型
std::tuple<catalog, catalog, someOtherSerializableClass>
Run Code Online (Sandbox Code Playgroud)