如果构造函数的执行顺序很重要,我如何使用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时避免构造函数的未定义执行顺序的问题的答案导致了一个讨论,在此期间我了解到构造函数可以保证参数评估的顺序:使用braced-init-list命令保证从左到右:
T{ a, b, c }
Run Code Online (Sandbox Code Playgroud)
表达式a,b和c,按给定的顺序进行评估.即使类型T只定义了普通的构造函数,也是如此.
显然,并非所有被调用的都是构造函数,有时候在调用函数时保证求值顺序会很好,但是没有像brace-argument-list这样的东西来调用函数,并且定义了对它们的参数的评估顺序.问题变成:构造函数的保证是否可以用于构建函数调用工具(" function_apply()"),并具有用于评估参数的排序保证?要求调用函数对象是可以接受的.