Eri*_*und 19 c++ tuples variadic-templates c++11
如果构造函数的执行顺序很重要,我如何使用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)
简单的解决方案不是首先使用std::make_tuple(...),而是std::tuple<...>直接构造一个:调用成员的构造函数的顺序是明确定义的:
template <typename>
std::istream& dummy(std::istream& in) {
return in;
}
template <typename... T>
std::tuple<T...> parse(std::istream& in) {
return std::tuple<T...>(dummy<T>(in)...);
}
Run Code Online (Sandbox Code Playgroud)
功能模板dummy<T>()仅用于展开某些内容.订单由以下元素的构造顺序强加std::tuple<T...>:
template <typename... T>
template <typename... U>
std::tuple<T...>::tuple(U...&& arg)
: members_(std::forward<U>(arg)...) { // NOTE: pseudo code - the real code is
} // somewhat more complex
Run Code Online (Sandbox Code Playgroud)
在下面的讨论和Xeo的评论之后,似乎有一个更好的选择是使用
template <typename... T>
std::tuple<T...> parse(std::istream& in) {
return std::tuple<T...>{ T(in)... };
}
Run Code Online (Sandbox Code Playgroud)
大括号初始化的使用起作用,因为大括号初始化列表中参数的求值顺序是它们出现的顺序.的语义T{...}在12.6.1 [class.explicit.init]第2款中描述说,它如下列表初始化语义规则(注:这有没有关系的std :: initializer_list只与同质类型的作品).排序约束在8.5.4 [dcl.init.list]第4段中.
| 归档时间: |
|
| 查看次数: |
1466 次 |
| 最近记录: |