それぞれ長さが異なる固定数のデータ型を格納するテンプレート化された基本クラスを作成しようとしていました。これが私がやろうとしていたことの単純化されたバージョンです:
template< int NINT, int NR0 >
class EncapsulatedObjectBase
{
public:
EncapsulatedObjectBase();
~EncapsulatedObjectBase();
double m_real[NR0];
int m_int[NINT];
}
ええ...テンプレートパラメータをゼロにすることができるので、オブジェクトの長さゼロの配列を宣言します。このベースには複数の派生クラスがあり、それぞれが独自の数の変数を定義します。2つの質問があります:
1)このアプローチには根本的な欠陥がありますか?
2)もしそうなら...長さゼロの配列をインスタンス化するときに、icc13またはgcc4.7.2がこれに関する警告を表示しないのはなぜですか?gccには、-wallと-wextra-wabiを使用します。警告がなかったので、こういうのは大丈夫だと思いました。
編集:
これが私が話していることを示すファイルの内容です:
#include <iostream>
template< int NINT, int NR0 >
class EncapsulatedObjectBase
{
public:
EncapsulatedObjectBase(){}
~EncapsulatedObjectBase(){}
double m_real[NR0];
int m_int[NINT];
};
class DerivedDataObject1 : public EncapsulatedObjectBase<2,0>
{
public:
DerivedDataObject1(){}
~DerivedDataObject1(){}
inline int& intvar1() { return this->m_int[0]; }
inline int& intvar2() { return this->m_int[1]; }
};
class DerivedDataObject2 : public EncapsulatedObjectBase<0,2>
{
public:
DerivedDataObject2(){}
~DerivedDataObject2(){}
inline double& realvar1() { return this->m_real[0]; }
inline double& realvar2() { return this->m_real[1]; }
};
int main()
{
DerivedDataObject1 obj1;
DerivedDataObject2 obj2;
obj1.intvar1() = 12;
obj1.intvar2() = 5;
obj2.realvar1() = 1.0e5;
obj2.realvar2() = 1.0e6;
std::cout<<"obj1.intvar1() = "<<obj1.intvar1()<<std::endl;
std::cout<<"obj1.intvar2() = "<<obj1.intvar2()<<std::endl;
std::cout<<"obj2.realvar1() = "<<obj2.realvar1()<<std::endl;
std::cout<<"obj2.realvar2() = "<<obj2.realvar2()<<std::endl;
}
これを「g++-Wall -Wextra -Wabi main.cpp」でコンパイルすると、警告は表示されません。警告を取得するには、-pedanticフラグを使用する必要があります。だから私はまだこれがどれほど危険かわかりません。振り返ってみると、それはあまり良い考えではないに違いないように感じます...私がそれをうまくやることができればそれはかなり役に立ちますが。