Супер поинт - это обычная точка, но с доп возможностями:
C++ (Qt)
class SuperPoint
{
public:
SuperPoint(const double &x1, const double &x2, const double &x3, const double &x4)
: _x1(x1), _x2(x2), _x3(x3), _x4(x4) {}
SuperPoint(const PointF &p) : _x1(p.x), _x2(p.y), _x3(p.z), _x4(0) {}
SuperPoint(const PointD &p) : _x1(p.x), _x2(p.y), _x3(p.z), _x4(0) {}
//...
PointF toPointF() const { return PointF(x1, x2, x3); }
PointD toPointD() const { return PointD(x1, x2, x3); }
//....
private:
double x1, x2, x3, x4;
};
В базовом классе тогда нужно будет определить два метода set и get:
C++ (Qt)
struct base
{
virtual ~base() {}
virtual Format format() const = 0;
virtual SuperPoint get(size_t index) const = 0;
virtual void set(size_t index, const SuperPoint &sp) = 0;
};
struct derivedF : public base
{
virtual Format format() const { return TPointF; }
virtual SuperPoint get(size_t index) const {
return SuperPoint(vector[index]);
}
virtual void set(size_t index, const SuperPoint &sp) {
vector[index] = sp.toPointF();
}
std::vector<PointF> vector;
};
// ...
Останется только адаптер написать.
В c++11, за счёт того, что там появилась такая фича, как constexpr, его можно было бы особенно изящно реализовать... (без всяких switch)