C ++模板std :: array <char16_t,n =“”>隐藏N到模板impl?

时间:2017-03-06 22:14:31

标签: c++ arrays c++11

我正考虑在C ++中创建内存Unicode字符数据库(ucd)。为例如存储代码点UTF-16容器必须是:

  • 内存容量很小:没有std::vectorstd::string等......
  • 同时对其代码单元进行randomaccess,并将数据整体对齐。
  • 必须具有快速可比性
  • 对于具有代理项的代码点,
  • 必须具有编译时灵活的大小

靠近的容器是std::array<char16_t, N>。但是我希望通过使用带参数pack的构造函数填充它来隐藏N

#include <array>
#include <utility>

template <typename CUT>
struct ucodepoint_storage
{
    typedef typename CUT         value_type;
    typedef unsigned char        size_type;

    template <size_type N>
    struct sizer
    {
        static constexpr size_type units = N;
        static constexpr size_type bytes = (N * sizeof(value_type));
    };

    using sizer_type = sizer<1>;

    template<typename... Chars>
    constexpr ucodepoint_storage(Chars&&... chars)
    : m_arrData(std::move(std::array<value_type, sizeof...(chars)>{ chars... }))
    {
        using sizer_type = sizer<sizeof...(chars)>;
    }

private:
    const std::array<value_type, sizer_type::units>     m_arrData;
};

当args的数量与默认值1不匹配时,无法编译。

这可能吗?一切都是已知的编译时间,看起来不同类型的同一成员是不可能的。我认为这是一个没有指针的pImpl成语,因为它们在我的64位机器上也会占用大量内存。

1 个答案:

答案 0 :(得分:1)

  

这可能吗?

没有

  

我认为这是一个没有指针的pImpl idom,因为它们在64位机器上也会占用大量内存。

没有64位平台,你的内存非常紧张,你不能包含另一个指针。

您不能将typedef范围限定为构造函数,并以某种方式使其与类范围保持一致。

由于类的大小/布局/成员取决于参数,因此需要对类本身进行参数化。