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

时间:2018-03-18 21:15:33

标签: c++ templates constexpr

我想创建一个具有std::map等方法的类,但它应该在编译时进行排序。哪个constexpr容器适合存储密钥template<class K>和值template<class V>

std :: vector不符合这些要求。

UPD:我们发现std::array有很多constexpr方法。而且我的问题足以使用std::array<std::pair<K, V> >。 但问题仍然存在。

1 个答案:

答案 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));