相关疑难解决方法(0)

Pretty-print std :: tuple

这是我之前关于漂亮印刷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)的加分点!

c++ tuples variadic-templates c++11

78
推荐指数
5
解决办法
2万
查看次数

使用std :: make_tuple时如何避免构造函数的未定义执行顺序

如果构造函数的执行顺序很重要,我如何使用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)

在阅读了对该问题的评论后,我得出了这个结论

将std :: tuple转换为模板参数包

这就是说

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)

c++ tuples variadic-templates c++11

19
推荐指数
1
解决办法
1466
查看次数

标签 统计

c++ ×2

c++11 ×2

tuples ×2

variadic-templates ×2