it-swarm.com.ru

Как создать шаблонную функцию в классе? (C++)

Я знаю, что можно сделать функцию шаблона:

template<typename T>
void DoSomeThing(T x){}

и можно сделать шаблон класса:

template<typename T>
class Object
{
public:
    int x;
};

но возможно ли сделать класс не в шаблоне, а затем сделать функцию в этом классе шаблоном? То есть:

//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
    template<class T>
    void DoX(){}
};

или что-то в той степени, где класс не является частью шаблона, но функция?

127
user98188

Ваше предположение является правильным. Единственное, что вы должны помнить, это то, что шаблон функции-члена definition (в дополнение к объявлению) должен находиться в заголовочном файле, а не в cpp, хотя он not должен находиться в теле самого объявления класса.

101
Not Sure

Смотрите здесь: Шаблоны , Методы шаблона , Шаблоны-члены, Шаблоны функций-членов

class   Vector
{
  int     array[3];

  template <class TVECTOR2> 
  void  eqAdd(TVECTOR2 v2);
};

template <class TVECTOR2>
void    Vector::eqAdd(TVECTOR2 a2)
{
  for (int i(0); i < 3; ++i) array[i] += a2[i];
}
62
none

Да, функции-члены шаблона совершенно легальны и полезны во многих случаях.

Единственное предостережение в том, что функции-члены шаблона не могут быть виртуальными.

19
Tobias

Самый простой способ - поместить объявление и определение в один и тот же файл, но это может привести к превышению размера исполняемого файла. Например.

class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}

Также возможно поместить определение шаблона в отдельные файлы, т.е. поместить их в файлы .cpp и .h. Все, что вам нужно сделать, это явно включить экземпляр шаблона в файлы .cpp. Например.

// .h file
class Foo
{
public:
template <typename T> void some_method(T t);
}

// .cpp file
//...
template <typename T> void Foo::some_method(T t) 
{//...}
//...

template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);
0
hey