[英]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::bitset
和std::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.