我想将元素的初始化值存储在一个单独的元组内的元组中,以便我可以将相同的值用作相应类型的其他元组的预设值。
对我的程序来说,元组元素的构造函数以从左到右的顺序被调用是非常重要的(否则它充其量只会变得非常混乱)。
这是我的程序的简化版本:
#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;
}
所以我用in的构造函数初始化列表初始化std::tuple<Elems...> elements
成员。这应该使用 pIniter 中的值定义的类型的相应初始化值来初始化每个元素。类型是 Widget 层次结构中每个成员的类型(例如 a或 an ),它是层次结构成员应该初始化的类型。但是发生这种情况的顺序是从右到左,而我需要从左到右。Widget<Elems...>
std::tuple<typename Elems::initer_t...>
Widget<Elems...>
elements
initer_t
initer_t
Widget<typename...>
Element
程序的输出是
Creating 4
Creating 3
Creating 2
Creating 1
Creating 0
但我想颠倒这个顺序。
在这种情况下我该怎么做?