我想创建一个具有std::map
等方法的类,但它应该在编译时进行排序。哪个constexpr
容器适合存储密钥template<class K>
和值template<class V>
?
std :: vector不符合这些要求。
UPD:我们发现std::array
有很多constexpr方法。而且我的问题足以使用std::array<std::pair<K, V> >
。
但问题仍然存在。
答案 0 :(得分:5)
大多数C ++标准库容器都不能用作constexpr。 AFAIK只有std::bitset
的前64位和std::array
(任意长度)是可填写的编译时间。
在程序本身准备好之前,不要专注于此类性能优化。使用可变参数模板函数填充大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));