【发布时间】:2018-03-21 18:57:24
【问题描述】:
我想将元组中元素的初始化值存储在一个单独的元组中,以便我可以将相同的值用作相应类型的其他元组的预设值。
元组元素的构造函数以从左到右的顺序调用对我的程序非常重要(否则它充其量只会变得非常混乱)。
这是我的程序的简化版本:
#include <tuple>
// Elements are the end points of a Widget hierarchy
struct Element
{
using initer_t = int;
Element( const initer_t pIniter )
:data{ pIniter }
{
printf("Creating %i\n", data);
}
const initer_t data;
};
// A Widget class stores any number of Elements and/or other Widget instances
template<typename... Elems>
struct Widget
{
using initer_t = std::tuple<typename Elems::initer_t...>;
Widget( const initer_t pIniter )
:elements{ pIniter }
{}
const std::tuple<Elems...> elements;
};
int main()
{
using Button = Widget<Element, Element>;
using ButtonList = Widget<Button, Button, Element>;
Button::initer_t basic_button_initer{ 0, 1 }; // presets for Buttons
Button::initer_t other_button_initer{ 2, 3 };
ButtonList::initer_t buttonlist_initer{ basic_button_initer, other_button_initer, 4 }; //a preset for a ButtonList
ButtonList buttonlist{ buttonlist_initer };
return 0;
}
所以我在Widget<Elems...> 的构造函数初始化列表中使用std::tuple<typename Elems::initer_t...> 初始化Widget<Elems...> 的std::tuple<Elems...> elements 成员。
这应该使用 pIniter 中的值使用 initer_t 定义的类型的相应初始化值来初始化 elements 的每个元素。
initer_t 类型是 Widget 层次结构中每个成员的类型(例如 Widget<typename...> 或 Element),这是层次结构成员应该初始化的类型。
但是发生这种情况的顺序是从右到左,而我需要从左到右。
程序的输出是
Creating 4
Creating 3
Creating 2
Creating 1
Creating 0
但我想颠倒这个顺序。
在这种情况下我该怎么做?
【问题讨论】:
-
即使这个订单也不能保证。
-
从 g++ 我得到 "4 3 2 1 0",从 clang++ "0 1 2 3 4"
-
我刚刚用 clang 和 clang++ 编译它,我得到 "4 3 2 1 0" ...
-
为什么您需要特定的订单?是用来记录的吗?
-
@stimulate "我只是用clang编译的" 不是有用的信息,因为这里重要的是
std::tuple的实现。所以使用 Clang 和 libstdc++ 将给出与 GCC 相同的结果(因为它使用相同的std::tuple)。使用 Clang 和 libc++ 不会。
标签: c++ templates constructor tuples order-of-execution