3

考虑 C++ 中的以下情况:

template<int n>
class Base { ... };

class Derived3 : public Base<3> {
  // a complicated body, making use of n=3
};

class Derived7 : public Base<7> {
  // a completely different body, making use of n=7
};

Derived3成员函数内部,我想显式使用n=3, 和内部Derived7, n=7,而不对数字进行硬编码,即,仍然引用模板参数之类的东西n。我想到了以下选项:

  1. 还将派生类模板化n,然后使用typedef. 这样,派生类知道n

    template<int n>
    class DerivedTemplate3 : public Base<n> { ... };
    typedef DerivedTemplate3<3> Derived3;
    
    template<int n>
    class DerivedTemplate7 : public Base<n> { ... };
    typedef DerivedTemplate7<7> Derived7;
    

    这样做的问题是DerivedTemplateX除了 之外什么都有意义n=X,所以这感觉就像在滥用模板范式。

  2. 使用静态 const 成员存储nBase并在派生类中引用它:

    template<int n>
    class Base {
    protected:
      static const int nn = n;
      ...
    };
    
    class Derived3 : public Base<3> {
      // refer to nn=3
    };
    
    class Derived7 : public Base<7> {
      // refer to nn=7
    };
    

    这里的问题是我似乎不能使用相同的标识符(nnvs. n)。另外,我不确定这是否允许我nn用作派生类成员的模板参数。

那么:如何以非冗余、高效的方式实现这一点?static const int也许在某处使用某种成员身份?

4

2 回答 2

5

标准做法是使用大写字母作为模板参数,然后使用小写的静态 const 值:

template<int N>
class Base {
protected:
  static const int n = N;
  ...
};

然后你在任何地方都使用小写的静态常量值n——不要N在其他任何地方使用。

另外,我不确定这是否允许我使用 nn 作为派生类成员的模板参数。

它是一个常量表达式,因此可以用作模板参数。

于 2013-01-21T09:34:13.893 回答
0

这对你有用吗?

template<int n>
class Base {
protected:
    static const int MyN = n;
};

class Derived3 : public Base<3> {
    void f()
    {
        std::cout << MyN;
    }
};

class Derived7 : public Base<7> {
    void f()
    {
        std::cout << MyN;
    }
};

int main()
{

}
于 2013-01-21T09:35:17.187 回答