相关疑难解决方法(0)

使用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
查看次数

调用函数对象时如何保证参数评估的顺序?

关于如何在使用std :: make_tuple时避免构造函数的未定义执行顺序的问题的答案导致了一个讨论,在此期间我了解到构造函数可以保证参数评估的顺序:使用braced-init-list命令保证从左到右:

T{ a, b, c }
Run Code Online (Sandbox Code Playgroud)

表达式a,bc,按给定的顺序进行评估.即使类型T只定义了普通的构造函数,也是如此.

显然,并非所有被调用的都是构造函数,有时候在调用函数时保证求值顺序会很好,但是没有像brace-argument-list这样的东西来调用函数,并且定义了对它们的参数的评估顺序.问题变成:构造函数的保证是否可以用于构建函数调用工具(" function_apply()"),并具有用于评估参数的排序保证?要求调用函数对象是可以接受的.

c++ c++11

18
推荐指数
2
解决办法
1894
查看次数

标签 统计

c++ ×2

c++11 ×2

tuples ×1

variadic-templates ×1