2

処理する必要がある限られた数の異なるタイプのオブジェクトの特定のパラメーターを取得するために、次のようなメカニズムがあります。

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..};
};

ハードコードされていても配列が非整数型であるため、コンパイルされません。現在の使用法とあまり変わらないように見える簡単なパッチはありますか? または、その配列のものをそこに入れる方法はありますか?

4

2 に答える 2

2

「静的暗黙的インライン関数静的ローカル変数」ハック:

template<typename T>
struct params;
struct Bob;
template<>
struct params<Bob> {
  static int paramE(unsigned int idx) {
    static const int v[] = {18, 20, 22, 24};
    return v[idx];
  }
};

#include <iostream>
int main() {
  for(auto i = 0; i < 4; ++i)
    std::cout << params<Bob>::paramE(i) << "\n";
}

結果の値は「コンパイル時の定数」ではなく (つまり、テンプレート パラメーターなどには使用できません)、コンパイラが定数に最適化するのは簡単なことです。

于 2012-12-06T20:05:29.300 に答える
2

この Stack Overflow questionのように、クラス内だけでなく、静的 const 配列を初期化できます。課題は、コンパイル ユニットごとに正確に 1 回初期化を実行する必要があることです。そのため、ほとんどの場合、ソース (.cpp) ファイルで実行されます。したがって、初期化の残りの部分から遠く離れてしまい、かなり大雑把になります。

于 2012-12-06T20:05:37.350 に答える