使用需要参数的构造函数初始化可变参数模板构造的类型元组

问题描述 投票:0回答:1

我很抱歉已经在这里提出了类似的问题,而我应该先修改我问的问题。

我有类

Level
,其构造函数需要参数。 使用可变参数模板,我为
LevelType
类的成员创建了一个类型
Tree
,它是
Level
类型元素的元组。

如何避免在

data
的初始化列表中重复值
Tree

作为进一步的约束,

Tree
类的对象应该可以在编译时构造,因此据我所知,我需要某种模板元编程-fu。

谢谢!

这是一个代码片段:

#include<utility>
#include<array>
#include<iostream>

class LevelData
{};

template <typename LevelType>
class Level
{            
    public:
    Level(LevelData & data_):
    data(data_)
    {};

    LevelData & data ;
};

template <std::size_t nLevels,typename LevelType>
class Tree
{            
    public:
    Tree(LevelData & data):
    level(data,data,data,data,data)
    {};

    LevelType level ;                                                                                                                                        
};

template <std::size_t nLevels,auto... Is>
auto make_tree_impl(std::index_sequence<Is...>)
    -> Tree<nLevels,std::tuple<Level<std::array<double, std::size_t{1} << Is>>...>>;

template <std::size_t nLevels>
using make_tree = decltype(make_tree_impl<nLevels>(std::make_index_sequence<nLevels>{}));

int main()
{
    const unsigned int nLevels = 5;
    LevelData data;
    auto tree = make_tree<nLevels>(data);
    std::cout << std::is_same<decltype(tree),
    Tree<nLevels,std::tuple<Level<std::array<double,1>>,
                            Level<std::array<double,2>>,
                            Level<std::array<double,4>>,
                            Level<std::array<double,8>>,
                            Level<std::array<double,16>>>>>::value << std::endl ;
    return 0;
}
c++ templates tuples initialization variadic
1个回答
0
投票

您可以再次使用

make_index_sequence
,只是这一次它用于重复
data
,因为您的
tuple
中有类型。

可以使用

(static_cast<void>(Is), data)...
来展开,因为
,
运算符的左边部分将被丢弃,只留下
data
sizeof...(Is)
次数。

template <std::size_t nLevels, typename LevelType>
class Tree {
public:
    Tree(LevelData& data)
        : level{[&]<std::size_t... Is>(std::index_sequence<Is...>) {
              return LevelType{(static_cast<void>(Is), data)...};
          }(std::make_index_sequence<std::tuple_size_v<LevelType>>())} {}

    LevelType level;
};
© www.soinside.com 2019 - 2024. All rights reserved.