template class mit zusätzlicher memer function fuer bestimmten parameter



  • hallo leute

    hier 3 beispielklassen:

    class class_1
    {
       public:
          using value_type = int;
          virtual auto value(value_type val) -> void = 0;
    };
    
    class class_2
    {
       public:
          using value_type = float;
          virtual auto value(value_type val) -> void = 0;
    };
    
    class class_3
    {
       public:
          using value_type = double;
          virtual auto value(value_type val) -> void = 0;
          virtual auto additional_info(int data( -> void = 0;
    };
    

    bis auf die 2te methode in class_3 koennte ich nun die implementierung als template machen:

    template<class T>
    class basic_class : public T
    {
       public:
          virtual auto value(value_type val) -> void
          {
             m_value = vall;
          }
    
       private:
          value_type m_value;
          //int m_additional_info;
    };
    
    using int_class = basic_class<class_1>;
    using float_class = basic_class<class_2>;
    using double_class = basic_class<class_3>;
    

    gibt es nun eine möglichkeit das ich fuer den template-parameter class_3 noch die 2te methode definieren und die member-variable m_additional_info anlegen kann? oder muss ich die basisklassen aufteilen und von class_3 nochmal erben ?

    Meep Meep


  • Mod

    Da additional_info virtuell ist, helfen SFINAE-tricks nicht.
    Es bleibt dir nichts anderes übrig, als basic_class partiell zu spezialisieren, wenn additional_info dort überschrieben werden soll. Evtl. genügt es aber auch, die Basisklasse zu ersetzen, etwa

    template <typename T>
    class implement_additional_info : public T
    {
      public:
          virtual void additional_info(int val) override {
    ...
    };
    template <typename T>
    class basic_class
      : public std::conditional_t<has_addional_info<T>{}, implement_additional_info<T>, T>
    {
    ...
    

    mit einem entsprechenden Prädikat has_addional_info.



  • ok, danke


Anmelden zum Antworten