确保派生类至少实现抽象类(C ++)中的两种方法之一

时间:2019-07-03 06:54:25

标签: c++ c++11

如何确保派生类在基类中实现至少两个选择的方法之一?

    class base {
     public:

     virtual int sample()=0;
     virtual Eigen::VectorXf sample()=0;
    };

    class Derived : Base {
    int sample() override {return 1;}

    }

此代码返回错误,因为没有使用VectorXf返回类型实现示例方法。但是,我的目的是只执行其中之一。它们在基类中分开的唯一原因是它们具有不同的返回类型。如何在C ++中做到这一点?

1 个答案:

答案 0 :(得分:2)

无法按返回类型重载。您可以改用std :: variant:

#include <variant>
class Base {
 public:

  virtual std::variant<int, Eigen::VectorXf> sample()=0;
};

class Derived : public Base {
  std::variant<int, Eigen::VectorXf> sample() override {return 1;}

};

如果只限于C ++ 11,那么有很多选择。

  1. 实现并使用类似variant的类:一个类,该类具有一个在两个活动类型之间进行选择的枚举器,以及一个包含这些类型的联合。
  2. 使用Boost variant
  3. std :: pair
  4. 实现类的层次结构(std :: any的简化),并返回指向对象的正确指针:

    class AbstractBase {
       public:
           virtual ~AbstractBase() = 0;
           template <class T>
           const T* get() const;
    };
    template <class T>
    class ValueWrapper : public AbstractBase {
           public:
              ValueWrapper(const T& value) : m_value(value) {}
              const T & getValue() const { return m_value; }
           private:
              T m_value;
    };
    
    template <class T>              
    inline const T * AbstractBase::get() const {
        auto child = dynamic_cast<ValueWrapper<T> const*>(this);
        return child ? &child->getValue() : nullptr;
    }
    class Base {
      public:
        virtual std::unique_ptr<AbstractBase> sample()=0;
    };
    

问题是,您为什么需要这个?