c++ - 构造 std::tuple 时定义元素初始化顺序

标签 c++ templates constructor tuples order-of-execution

我想将元组中元素的初始化值存储在一个单独的元组中,这样我就可以使用相同的值作为相应类型的其他元组的预设。

以从左到右的顺序调用元组元素的构造函数对我的程序非常重要(否则它充其量只会变得非常困惑)。

这是我的程序的简化版本:

#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;
}

所以我正在初始化 std::tuple<Elems...> elements Widget<Elems...>的成员用std::tuple<typename Elems::initer_t...>Widget<Elems...>的构造函数初始化列表。 这应该初始化 elements 的每个元素及其相应的由 initer_t 定义的类型的初始化值使用 pIniter 中的值。 initer_t type 是 Widget 层次结构的每个成员的类型(例如 Widget<typename...>Element ),这是层次结构成员应该初始化的类型。 但是发生这种情况的顺序是从右到左,而我需要从左到右。

程序的输出是

Creating 4
Creating 3
Creating 2
Creating 1
Creating 0

但我想颠倒这个顺序。

在这种情况下我该怎么做?

最佳答案

恐怕std::tuple成员初始化的顺序在标准中没有要求。

不过,您可以按特定顺序遍历 tuple,例如:

#include <tuple>
#include <iostream>

#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/fusion/algorithm/iteration/for_each.hpp>

int main()
{
    auto a = std::make_tuple(true, 42, 3.14, "abc");
    boost::fusion::for_each(a, [](auto& value) {
            std::cout << value << '\n';
        });
}

输出:

1
42
3.14
abc

关于c++ - 构造 std::tuple 时定义元素初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49414550/

相关文章:

c++ - 带指针的奇怪运算符

c++ - 避免不依赖于模板类型的函数的多个模板实例化的优雅方法

C++ 对象创建和构造函数

抽象类的 C++ 保护构造函数

C++如何在不调用构造函数的情况下分配对象

c++ - std::vector::front() 用于什么?

html - 通过 tcp 和浏览器发送带有 HTTP 协议(protocol)的 html 文件显示错误

c++ - 用 C/C++ 编译 DLL,然后从另一个程序调用它

C++模板类型转换

python - Jinja active_page 在包含的文件中不起作用