首页 > 解决方案 > 如何以编程方式生成相同值的 std::index_sequence 而无需对每个元素进行递归模板实例化

问题描述

#include <utility>

template<std::size_t Value, std::size_t Count, typename T = std::index_sequence<>>
struct index_sequence_of_same_value;

template<std::size_t Value, std::size_t Count, std::size_t... Rest>
struct index_sequence_of_same_value<Value, Count, std::index_sequence<Rest...>>
{
    using type = typename index_sequence_of_same_value<Value, Count - 1, std::index_sequence<Value, Rest...>>::type;
};

template<std::size_t Value, std::size_t... Rest>
struct index_sequence_of_same_value<Value, 0, std::index_sequence<Rest...>>
{
    using type = std::index_sequence<Rest...>;
};

template<std::size_t Value, std::size_t Count, typename T = std::index_sequence<>>
using make_index_sequence_of_same_value= typename index_sequence_of_same_value<Value, Count, T>::type;


int main()
{
    make_index_sequence_of_same_value<4, 6> t; // std::integer_sequence<std::size_t, 4, 4, 4, 4, 4, 4>
}

使用递归模板实例化这似乎很简单。但是这个实现非常慢并且也有限制,因为它必须递归地为每个元素实例化模板实例。

是否有另一种方法可以在不为元素数量实例化模板的情况下做类似的事情?

标签: c++templatesmetaprogrammingtemplate-meta-programming

解决方案


可能是这样的:

template <std::size_t Value, std::size_t... Is>
std::index_sequence<(Is, Value)...> make_sequence_helper(
    std::index_sequence<Is...>);  // no definition

template<std::size_t Value, std::size_t Count>
using make_index_sequence_of_same_value =
    decltype(make_sequence_helper<Value>(std::make_index_sequence<Count>()));

演示


推荐阅读