![](/img/trans.png)
[英]How to create a `std::integer_sequence` out of `__func__`?
[英]How to create std::initializer_list with integer_sequence?
我有一個 integer_sequence,我需要為std::map
的構造函數創建std::initializer_list
。 想法如下:
template<uint8_t... Indices>
static constexpr auto GenerateRegMap(std::integer_sequence<uint8_t, Indices...>)
-> std::initializer_list<std::pair<uint8_t const, uint8_t>>
{
return {{Indices, 0}...};
}
constexpr auto s = std::integer_sequence<uint8_t, 2, 4, 5, 7, 8, 10, 11, 13, 15>{};
std::map<uint8_t, uint8_t> m (GenerateRegMap(s));
std::cout << m.size() << std::endl;
for (const auto &pair : m)
{
std::cout << static_cast<int>(pair.first) << " has value " << static_cast<int>(pair.second) << std::endl;
}
通常會生成std::initializer_list
,但無法返回:它使用本地存儲。 我無法想象如何將GenerateRegMap
的內容寫到位。
真的m
是一些 class 的私有字段,最好在成員初始化列表中初始化它。
為什么我不從GenerateRegMap
返回std::map<uint8_t, uint8_t>
? 因為我有一個錯誤: a constexpr function cannot have a nonliteral return type
。
您可以使用 C++14 變量模板直接生成initializer_list
,而不是從GenerateRegMap
返回本地initializer_list
template<uint8_t... Indices>
constexpr std::initializer_list<std::pair<uint8_t const, uint8_t>> my_list =
{{Indices, 0}...};
constexpr auto s = my_list<2, 4, 5, 7, 8, 10, 11, 13, 15>;
std::map<uint8_t, uint8_t> m(s);
如果希望變量模板以integer_sequence
為模板類型,可以使用模板偏特化獲取integer_sequence
的值來初始化initializer_list
,例如
using L = std::initializer_list<std::pair<uint8_t const, uint8_t>>;
template<class Seq>
constexpr L my_list = {};
template<class Seq>
constexpr L my_list<const Seq> = my_list<Seq>;
template<uint8_t... Indices>
constexpr L my_list<std::integer_sequence<uint8_t, Indices...>> = {{Indices, 0}...};
這使您能夠使用預定義的integer_sequence
生成initializer_list
constexpr auto s = std::integer_sequence<uint8_t, 2, 4, 5, 7, 8, 10, 11, 13, 15>{};
std::map<uint8_t, uint8_t> m(my_list<decltype(s)>);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.