笔记:
根据liveworkspace.org的说法,这个问题的答案适用于 g++ (4.7.2)、clang (3.2) 和 icc (13.0.1) 的最新版本,但根据 Stephen Lin 的评论,这取决于空基优化和的实施std::tuple
。
原来的问题:
如果我有一个看起来像这样的模板结构:
template<
class T1, unsigned short N1,
class T2, unsigned short N2
>
struct ComboThree {
T1 data_1[N1];
T2 data_2[N2];
};
我可以通过专门化它来避免零长度数组和额外的对齐填充:
template<class T1, class T2>
struct ComboThree<T1, 0, T2, 0> {
};
template<class T1, class T2, unsigned short N2>
struct ComboThree<T1, 0, T2, N2>
{
T2 data_2[N2];
};
template<class T1, unsigned short N1, class T2>
struct ComboThree<T1, N1, T2, 0>
{
T1 data_1[N1];
};
但是,当 TX/NX 对中的 X 变得更大时,这样的专业化变得有些麻烦。在我的项目中,不同组合的实际数量可能会少于五个,所以我最终可能根本不使用模板,但我很好奇:
有没有办法使用 TEMPLATE MAGIC 来避免零长度数组,同时避免占用任何额外空间?
例如,这个:
template<class T, unsigned short N>
struct Array {
T data[N];
};
template<class T>
struct Array<T, 0> {};
template<
class T1, unsigned short N1,
class T2, unsigned short N2
>
struct ComboTwo {
Array<T1, N1> data_1;
Array<T2, N2> data_2;
};
避免了零长度数组,但空结构占用额外空间。另一方面,这是:
template<class T, unsigned short N>
struct Array {
T data[N];
};
template<class T>
struct Array<T, 0> {};
template<
class T1, unsigned short N1,
class T2, unsigned short N2
>
struct ComboFour : Array<T1, N1>, Array<T2, N2> {};
似乎做我想做的事(是吗?),但我不知道如何访问程序中 Array<> 基本结构中的数据。 它还具有以下 Stephen Lin 指出的其他限制。