ノート:
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がはるかに大きくなると、このように専門化するのは面倒になります。私のプロジェクトでは、実際のさまざまな組み合わせの数はおそらく5つ未満になるため、テンプレートをまったく使用しないことになりますが、興味がありました。
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<>基本構造体のデータにアクセスする方法がわかりません。 また、以下のStephenLinが指摘する他の制限もあります。