7

static const メンバーを持つテンプレート クラスがあります。

template <class T>
class A
{
public:
    A(T val) : t(val) {}

    static const int VALUE = 5;

    T t;
};

コードのどこかで、int、char、および long 型を使用してインスタンス化しているとしましょう。今、私は VALUE にアクセスしたい:

int main()
{
    int i1 = A<int>::VALUE;
    int i2 = A<char>::VALUE;
    int i3 = A<long>::VALUE;

    return 0;
}

上記のすべてが同じものにアクセスするための同じ方法ではありませんか? このような場合、他の人はランダムなタイプを選択するだけですか? タイプの指定を避ける方法はありますか?

4

1 に答える 1

6

これらはすべて数値定数であり、同じ値を共有していますが、異なる名前空間に属しています。したがって、実際には必要ない場合でも、(テンプレートをインスタンス化することによって) 囲んでいるクラスを指定することを避けることはできません。

ただし、定義を継承するstatic constクラスに移動することはできます。A<T>

class A_Consts
{
  static const int VALUE = 5;
  ...
}; 

template<typename T>
class A : public A_Consts
{
...
};

または、定数定義をクラスの外に移動し、両方をネームスペースで囲みます。これは、私見のより良い解決策のようです。

于 2012-12-27T23:12:34.423 に答える