簡體   English   中英

C++17 中的 constexpr 容器是什么?

[英]What are constexpr containers in C++17?

我想創建一個具有類似std::map方法的類,但它應該在編譯時進行排序。 哪些constexpr容器適合存儲鍵template<class K>和值template<class V>

std::vector 不滿足這些要求。

UPD:我們發現std::array有很多 constexpr 方法。 對於我的問題,使用std::array<std::pair<K, V> >就足夠了。 但問題仍然存在。

大多數 C++ 標准庫容器並不像 constexpr 那樣有用。 AFAIK 只有前 64 位的std::bitsetstd::array (任意長度)是可填充的編譯時間。

在程序本身准備就緒之前,不要專注於此類性能優化。 在 C++11 中使用可變參數模板函數填充大型std::array編譯時並不太難。

如何使用可變參數模板在編譯時填充 4 個整數數組(每個整數代表 6 種顏色中的一種)的示例:

constexpr int ColorCount = 6;
constexpr int PositionCount = 4;

using Positions = std::array<int, PositionCount>;

template <int N>
struct PositionsFiller
{
    template <typename T, typename ...Tn>
    static constexpr Positions fill(T packed, Tn ...rest)
    {
        return PositionsFiller<N - 1>::fill(packed / ColorCount, packed % ColorCount, rest...);
    }
};

template <>
struct PositionsFiller<1>
{
    template <typename T, typename ...Tn>
    static constexpr Positions fill(T last, Tn ...rest)
    {
        return Positions{last, rest...};
    }
};

constexpr Positions pos666(PositionsFiller<PositionCount>::fill(666));

在 C++17 中,同樣可以用簡單的循環來完成,因為對 constexpr 的要求放寬了,並且不需要可變參數模板:

constexpr int ColorCount = 6;
constexpr int PositionCount = 4;

using Positions = std::array<int, PositionCount>;

static constexpr Positions fillPositions(int packed)
{
    Positions ret{};
    for (Positions::size_type i = ret.size(); i > 0; --i)
    {
        ret[i-1] = packed % ColorCount;
        packed /= ColorCount;
    }
    return ret;
}

constexpr Positions pos666(fillPositions(666));

請注意,在編譯時間進行復雜的准備工作會減慢編譯速度。 當模塊仍在開發中時,這可能很煩人。 更好的辦法是在程序開始時填充通常的可變數組,然后用編譯時填充等優化來替換它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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