我正考虑在C ++中创建内存Unicode字符数据库(ucd)。为例如存储代码点UTF-16容器必须是:
std::vector
,std::string
等...... 靠近的容器是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位机器上也会占用大量内存。
答案 0 :(得分:1)
这可能吗?
没有
我认为这是一个没有指针的pImpl idom,因为它们在64位机器上也会占用大量内存。
没有64位平台,你的内存非常紧张,你不能包含另一个指针。
您不能将typedef
范围限定为构造函数,并以某种方式使其与类范围保持一致。
由于类的大小/布局/成员取决于参数,因此需要对类本身进行参数化。