c++ - 如何以编程方式生成相同值的 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>
}
使用递归模板实例化这似乎很简单。但是这个实现非常慢并且也有限制,因为它必须递归地为每个元素实例化模板实例。
是否有另一种方法可以在不为元素数量实例化模板的情况下做类似的事情?
解决方案
可能是这样的:
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>()));
推荐阅读
- c# - 比较 2 个相同对象类型的列表
- json - T-SQL - JSON_QUERY :选择属性名称中带有特殊字符的 json 属性
- android - 为什么 Android 视图值在运行时不同?
- linux - Why does echo `cat file` lose all formatting?
- android - How to encrypt the Key and IV which used in AES Encryption Model in android App
- c++ - 使用 extern inline 时 G++ 发出“指定存储类”错误
- excel - How do I manipulate databases in excel through sqlite or transfer databases from one to another (both from and to excel and sqlite)?
- c# - #Dotnet EF Core migration issue Foreign key constraint is incorrectly formed
- symfony - Symfony Messenger 4.3 - 从理论传输中消费消息失败(抛出异常)
- python - 如何使用 pandas read_gbq 防止 SQL 注入