我很抱歉已经在这里提出了类似的问题,而我应该先修改我问的问题。
我有类
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;
}
您可以再次使用
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;
};