在为较大的 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;
}
您不需要
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>;