简化编译时二叉树类型的创建

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

在为较大的 C++ 项目创建二叉树类型的上下文中,我需要创建一个表示每个级别中的节点的编译时类型。

有谁知道,使用最新的标准,是否有一种更简单、更好看的方法来创建

LevelType
,对于下面(非常简化的)代码中的任意值
nLevels

我只需要 type,这样我就可以为类定义它

Tree

谢谢!

#include<array>
#include<iostream>

template <typename LevelType>
class Tree
{            
    public:
    LevelType level ;                                                                                                                                        
};

template <std::size_t nLevels, std::size_t... Is>
constexpr auto make_tree_impl(std::index_sequence<Is...>)
{
    return Tree
    <typename std::remove_reference
    <decltype(std::make_tuple(std::array<double,1<<Is>()...))>::type>();
};

template <std::size_t nLevels>
constexpr auto make_tree()
{
    return make_tree_impl<nLevels>(std::make_index_sequence<nLevels>());
};

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

您不需要

std::remove_reference
,因为
make_tuple
返回纯右值。

你不需要

std::make_tuple
。您可以直接指定
std::tuple

您不需要

make_tree
成为函数。如果您只想要类型,它可以是别名模板。

通过上面的内容,您也不需要定义

make_tree_impl
,因为它只会被调用以获得返回类型,而作为纯右值,它又不需要
remove_reference
:

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

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

然后你可以直接使用以下命令获取类型:

using T = make_tree<nLevels>;
© www.soinside.com 2019 - 2024. All rights reserved.