38 votes

Contourner modèle de spécialisation

Supposons que je suis un utilisateur d'un Certain Modèle de Bibliothèque (CTL) qui définit un modèle, nommé, disons, Hector

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

Et dans la documentation, il donne de nombreuses garanties sur Hector modèle de comportement. Mais ensuite, il définit également une spécialisation d'un certain type, Cool

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

L'objectif de la spécialisation est plus optimisé de la mise en œuvre de l' Hector, mais malheureusement à cause de cette optimisation beaucoup de garanties Hector sont violés.

Actuellement je n'ai vraiment pas besoin de l'optimisation, je préfère préserver toutes les garanties d' Hector. Est-il possible, sans modifier le code de la bibliothèque (CTL est un très respectable de la bibliothèque, vous savez), contourner la spécialisation? De toute façon, à tous? Peut-être écrire une sorte de wrapper? Quoi que ce soit? Je veux juste le compilateur pour générer du code pour Hector<Cool> dans un état normal, non-optimisé façon, avec toutes les garanties.

12voto

Mikola Points 5586

Vous pouvez rassembler refroidir dans un type dummy pour prévenir le modèle à partir spécialisé elle.

12voto

Mark B Points 60200

Êtes-vous en mesure d'utiliser le liés modèle Reque qui n'ont pas les indésirables de la spécialisation? Sinon, je pense que vous auriez besoin de créer un wrapper pour Cool alors que la spécialisation n'est pas utilisé.

8voto

GManNickG Points 155079

Pas de. Et même si cela peut être fait dans certains ésotérique de la mode, n'en ont pas. Contourner les fonctionnalités de la langue doit déclencher un signal d'alarme.

Vous devez envelopper la valeur ou l'utilisation d'un autre type, comme char au lieu de bool (ils se comportent de la même façon), donner des std::vector<char> au lieu de std::vector<bool>.

7voto

Kerrek SB Points 194696

Voici un petit générique disguiser:

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;
};

Maintenant, vous pouvez dire Hector<Drool<Cool>>.


Version améliorée selon 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;
};

1voto

Peter Alexander Points 31990
  1. Ouvrez le standard de mise en œuvre de certaines
  2. Ctrl+A
  3. Ctrl+C
  4. Créer un nouveau fichier appelé "my_hector.h"
  5. Ctrl+V
  6. Supprimer la spécialisation
  7. Rechercher et remplacer #include <hector> avec #include "my_hector.h"
    [ Edit pour @Xeo ;-) ]
  8. Renommer des identifiants qui commencent avec les deux principales souligne suivie d'une lettre minuscule, et tous les identificateurs commençant par un seul trait de soulignement suivantes par une lettre majuscule.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X