簡體   English   中英

如何使用 integer_sequence 創建 std::initializer_list?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM