Utilisation de enable_if pour désactiver un constructeur de modèle d'une classe de modèle


John Wayne

J'essaie de désactiver un constructeur de modèle d'une classe de modèle en utilisant std::enable_iflorsque le type des arguments du constructeur de modèle correspond au type " MyClass" afin que je puisse utiliser mon autre constructeur qui me permet d'initialiser la classe du modèle actuel avec la classe d'un autre.

template <typename t, size_t size>
class MyClass
{
public: 
   MyClass() { data.fill(static_cast<T>(0)); }

   template <typename... Args> // i want to disable this if Args = MyClass
   MyClass(Args&&... args) : data{ std::forward<Args>(args)... } {}

   template <size_t size2>
   MyClass(const Myclass<t, size2>& other_sized_template) { /*do stuff*/ } // this won't work unless the template ctor above is disabled if the arguments passed are of type Myclass

private:
   std::array<t, size> data;
};
songyuanyao

Vous pouvez vérifier si le type est une instanciation de MyClasspar un modèle de classe avec spécialisation partielle. par exemple

template<class...>
struct is_MyClass : std::false_type {};

template <typename T, size_t size>
struct is_MyClass<MyClass<T, size>> : std::true_type {};

puis désactivez le constructeur comme

template <typename... Args, 
          typename = std::enable_if_t<
            !is_MyClass<
              std::remove_cv_t<
                std::remove_reference_t<Args>>...>::value> > // i want to disable this if Args = MyClass
MyClass(Args&&... args) : data{ std::forward<Args>(args)... } {}

VIVRE

Articles connexes


Utiliser une classe dérivée pour le constructeur de modèle

GB J'ai une classe avec un constructeur de modèle: class TCons { template <typename T> TCons(T t); } qui est spécialisé dans la mise en œuvre: template <> TCons::TCons(int i) { doMyStuff(i); } J'ai également une spécialisation pour une classe de base: te