Elusión de la especialización de plantillas


Supongamos que soy un usuario de una cierta Biblioteca de Plantillas (CTL) que define una plantilla, llamada, digamos, Hector

template <class T>
class Hector {...};

Y en su documentación da muchas garantías sobre el comportamiento de la plantilla Hector. Pero también define una especialización para un cierto tipo Cool

template <>
class Hector<Cool> {....};

El propósito de la especialización es una implementación más optimizada de Hector, pero desafortunadamente debido a esta optimización se violan muchas garantías de Hector.

Actualmente I realmente no necesito la optimización, prefiero preservar todas las garantías de Hector. ¿Hay alguna forma en que podría, sin cambiar el código de la biblioteca (CTL es una biblioteca muy respetable, ya sabes), eludir la especialización? ¿De alguna manera? Tal vez escribir algún tipo de envoltura? ¿Algo? Solo quiero que el compilador genere código para Hector<Cool> de una manera normal, no optimizada, con todas las garantías.

Author: Armen Tsirunyan, 2011-06-28

5 answers

¿Puede usar la plantilla relacionada Reque que no tiene la especialización no deseada? De lo contrario, creo que necesitarías crear un wrapper para Cool para que no se use la especialización.

 12
Author: Mark B,
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
2011-06-27 21:33:19

Puede envolver cool en un tipo ficticio para evitar que la plantilla lo especialice.

 12
Author: Mikola,
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
2011-06-27 21:15:31

No. E incluso si se puede hacer de alguna manera esotérica, no lo hagas. Eludir las características del lenguaje debería activar una alarma.

Debe envolver el valor o usar un tipo diferente como char en lugar de bool (se comportan de manera similar), dando std::vector<char> en lugar de std::vector<bool>.

 8
Author: GManNickG,
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
2011-06-27 21:18:11

Aquí hay un pequeño disfraz genérico:

template <typename T>
struct Drool
{
  Drool(T d) : b(d) { }
  inline operator T() const { return b; }
  inline Drool<T> & operator=(T d) { b = d; return *this; }
private:
  T b;
};

Ahora puedes decir Hector<Drool<Cool>>.


Versión mejorada según Xeo:

template <typename T>
struct Drool
{
  Drool(const T & d) : b(d) { }
  Drool(Drool && o) = default;

  inline operator const T & () const { return b; }
  inline operator       T & ()       { return b; }

private:
  T b;
};
 7
Author: Kerrek SB,
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
2011-06-27 22:19:19
  1. Abra el estándar cierta implementación
  2. Ctrl+A
  3. Ctrl+C
  4. Crea un nuevo archivo llamado "my_hector.h"
  5. Ctrl+V
  6. Eliminar la especialización
  7. Buscar y reemplazar #include <hector> por #include "my_hector.h"
    [Editar para @Xeo; -)]
  8. Cambie el nombre de los identificadores que comienzan con dos guiones bajos seguidos de una letra minúscula y de todos los identificadores que comienzan con un solo guión subrayado seguido de una letra mayúscula.
 0
Author: Peter Alexander,
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
2011-06-27 21:38:26