Как мне вызвать статические члены класса шаблона? - PullRequest
8 голосов
/ 08 декабря 2010

Если у меня есть:

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

В этом случае A<int>::f() совпадает с A<double>::f(), но я не хочу вызывать A::f() через параметр шаблона. Существует ли синтаксис, позволяющий вызывать f(), но не требующий параметра шаблона?

Ответы [ 6 ]

16 голосов
/ 08 декабря 2010

Компилятор не знает, что 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() - это действительно одно и то же.

2 голосов
/ 08 декабря 2010
  1. Нет синтаксиса для указания этого. В любом случае, нет особых оснований делать f статическим методом. Вместо этого сделайте это бесплатной функцией. Если по какой-то причине вам необходимо сделать его статическим методом, реализуйте его в терминах свободной функции и просто вызовите его.
  2. Многие компиляторы, вероятно, сделают это для вас автоматически.
1 голос
/ 08 декабря 2010

Конечно.Присвойте ему псевдоним, назначив его указателю на функцию.

1 голос
/ 08 декабря 2010

Нет - если вы не хотите использовать аргумент шаблона, не объявляйте класс с параметром шаблона. Если вам нужен аргумент шаблона для других членов класса, но он не нужен в f, то переместите f из класса.

0 голосов
/ 08 декабря 2010

Обходной обходной путь (если вы не хотите использовать наследование и не хотите делать его функцией, не являющейся членом), вы можете указать тип по умолчанию для вашего класса:

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() и т. Д., Но если у вас нет зависимости типа в функции - тогда вышеописанное может работать ...

0 голосов
/ 08 декабря 2010

Нет, на самом деле 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().

...