如何调用模板类的静态成员?

时间:2010-12-08 17:39:38

标签: c++ templates static-methods

如果我有:

template <class T>
class A
{
 static void f()
 {
  // not using template parameter T
 }
};

在这种情况下,A<int>::f()A<double>::f()相同,但我不希望通过模板参数调用A::f()。是否存在允许调用f()但不需要模板参数的语法?

7 个答案:

答案 0 :(得分:16)

编译器不知道A<T>::f()不使用类型参数T。事实上,只要您使用f,就必须为编译器提供类型。

但是当我设计一个模板类时,我注意到某些成员/方法不依赖于模板参数,我会经常将它们移到非模板基类。

class A_Base {
public:
  static void f();
};

template <class T> class A : public A_Base {
  // ...
};

现在A_Base::f()A<int>::f()A<double>::f()真的都是一样的。

答案 1 :(得分:2)

  1. 没有指定的语法。无论如何,没有理由让f成为静态方法。让它成为一个免费的功能。如果由于某种原因必须使其成为静态方法,请根据自由函数实现它,并且只需调用它。
  2. 许多编译器可能会自动为您执行此操作。

答案 2 :(得分:1)

否 - 如果您不想使用模板参数,请不要使用模板参数声明该类。如果您需要该类的其他成员的模板参数,但在f中不需要它,则将f移出该类。

答案 3 :(得分:1)

不确定。通过将其指定给函数指针来为它赋予别名。

答案 4 :(得分:0)

不,实际上A<int>::f()A<any_other_type>::f()不同。他们真的不一样。如果希望f()真正独立于参数,可以使模板类A继承自另一个提供f()的类作为静态成员函数的类(有时称为特征) :

struct X
{
  static void f() { ...}
};

template <typename T>
struct A : X
{
  ...

然后,您可以拨打A<type>::f()X::f()

答案 5 :(得分:0)

一个简单的解决方法(如果你不想使用继承而你不想让它成为非成员函数),你可以为你的类指定一个默认类型:

template <class T = bool>
class A
{
  public:
   static void f() { cout << "f()" <<  endl; }
};

int main(void)
{
  A<>::f();
  return 0;
}

注意:此方法A<int>::f()A<long>::f()等不同,但如果您在函数中没有类型依赖项 - 那么上面的方法可以正常工作...

答案 6 :(得分:0)

每个类模板实例化都有其自己的任何静态数据成员的副本。静态声明可以是模板参数类型,也可以是任何定义的类型。

您必须分别定义静态成员。下面的示例演示了这一点:

template <class T> class K
{
public:
     static T x;
};
template <class T> T K<T> ::x;

int main()
{
    K<int>::x = 0;
}

语句模板T K :: x定义了类K的静态成员,而main()函数中的语句为K的数据成员分配了一个值。