処理する必要がある限られた数の異なるタイプのオブジェクトの特定のパラメーターを取得するために、次のようなメカニズムがあります。
template <class T>
struct params {};
template <>
struct params<FooObj>
{
static const int paramA = 17;
static const int paramB = 29;
};
これにより、後でコードが簡素化されます。これは、switch ステートメントでさまざまなオブジェクトの処理を処理するときに、 を取得した場合、FooObj
次のようなことを行うだけでよいためです。
typedef params<FooObj> paramsT;
そして、そのコードスニペットで、パラメーターにアクセスして、それをFooObj
介して操作することができますparamsT::paramC
。
今、私は次のようなものを持っているオブジェクトに遭遇しました:
template <>
struct params<BarObj>
{
static const int paramA = 0;
static const int paramB = 9;
static const int paramC = 17;
static const int paramD1 = 18;
static const int paramE1 = 20;
static const int paramD2 = 28;
static const int paramE2 = 30;
static const int paramD3 = 38;
static const int paramE3 = 40;
static const int paramD4 = 48;
static const int paramE4 = 50;
static const int paramD5 = 58;
static const int paramE5 = 60;
static const int paramD6 = 68;
static const int paramE6 = 70;
};
そして、このオブジェクトを処理しているときに、次のようなものを書き始めました。
typedef params<BarObj> paramsT;
BarObj bar;
//load the first 3 params via the above info into bar
int a,b;
for (int i = 1; i <= 6; ++i)
{
a = doSomethingA(bla + paramsT::paramD1);
b = doSomethingB(bla + paramsT::paramE1);
bla.paramD1 = functionOf(stuff,and,a,b);
}
もちろん、上記は1
それにハードコーディングされており、理想的には次のように表示されます。
typedef params<BarObj> paramsT;
BarObj bar;
//load the first 3 params via the above info into bar
int a,b;
for (int i = 0; i < 6; ++i)
{
a = doSomethingA(bla + paramsT::paramD[i]);
b = doSomethingB(bla + paramsT::paramE[i]);
bla.paramD[i] = functionOf(stuff,and,a,b);
}
上記のようなものでは、params テンプレートの特殊化を次のようにする必要があります。
template <>
struct params<BarObj>
{
static const int paramA = 0;
static const int paramB = 9;
static const int paramC = 17;
static const int paramD[] = {18, etc..};
static const int paramE[] = {20, etc..};
};
ハードコードされていても配列が非整数型であるため、コンパイルされません。現在の使用法とあまり変わらないように見える簡単なパッチはありますか? または、その配列のものをそこに入れる方法はありますか?