¿Cómo crear una función de plantilla dentro de una clase? (C++)


Sé que es posible hacer una función de plantilla:

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

Y es posible hacer una clase de plantilla:

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

Pero, ¿es posible hacer que una clase no esté dentro de una plantilla, y luego hacer que una función en esa clase sea una plantilla? Ie:

//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(){}
};

O algo en la medida, donde la clase no es parte de una plantilla, pero la función es?

Author: Not Sure, 2009-06-09

4 answers

Tu conjetura es la correcta. Lo único que debe recordar es que la función miembro template definition (además de la declaración) debe estar en el archivo de encabezado, no en el cpp, aunque no debe estar en el cuerpo de la declaración de clase en sí.

 95
Author: Not Sure,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 19:59:19

Ver aquí: Plantillas, métodos de plantilla , Plantillas Miembro, Plantillas de Función Miembro

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];
}
 61
Author: none,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-05 00:36:16

Sí, las funciones miembro de plantilla son perfectamente legales y útiles en numerosas ocasiones.

La única advertencia es que las funciones miembro de plantilla no pueden ser virtuales.

 18
Author: Tobias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-11 18:10:22

La forma más fácil es poner la declaración y la definición en el mismo archivo, pero puede causar un archivo excutable de tamaño excesivo. Por ejemplo,

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

Además, es posible poner la definición de plantilla en los archivos separados, es decir, ponerlos .cpp y .archivos h. Todo lo que necesita hacer es incluir explícitamente la instanciación de plantilla a la .archivos cpp. Por ejemplo,

// .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
Author: hey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-31 06:16:03