C++ (Qt)enum PointType {TPointF, TPointX, TUnknown}; // Предварительное объявлениеtemplate <class T>struct derived; // класс basestruct base{ virtual ~base() {} virtual PointType type() const = 0; template <class T> T get(std::size_t index) const { switch(type()) { case TPointF: { derived<PointF> *d = static_cast<derived<PointF>*>(this); return d->vector[index]; } break; case TPointX: { derived<PointX> *d = static_cast<derived<PointX>*>(this); return d->vector[index]; } break; } return T(); } template <class T> void set(std::size_t index, const T& val) { switch(type()) { case TPointF: { derived<PointF> *d = static_cast<derived<PointF>*>(this); d->vector[index] = val; } break; case TPointX: { derived<PointX> *d = static_cast<derived<PointX>*>(this); d->vector[index] = val; } break; } }}; // Реализация derivedtemplate <class T>struct derived : public base{ virtual PointType type() const { return traits<T>::type(); } std::vector<T> vector;}; // объявляем некую функцию, которая принимает базовый класс basevoid func(base *x) { x->set(0, PointF(1,2,3)) std::cout << x->get(0) << std::endl;}
C++ (Qt)class CModel { ... CoordVec * mPosition; // собственно координаты точек CoordVec * mNormal; // нормали (перпендикуляры) к точкам CoordVec * mSрaceUV; // позиции точек в UV(W) пространстве CoordVec * mBlur; // позиции motion blur CoordVec * mNURBS; // и.т.д };
C++ (Qt)template <class T1. class T2. class T3... >class CModel {// вставить эту лабуду в проекте везде-везде// и если у CModel появился новый член..
C++ (Qt)// CModelUserPoint3F pt = model.mCoordinate->GetPoin3F(index);if (model.mSpaceUV) { // UV имеются? // крутим UV}
C++ (Qt)struct super_vector{ TypeOfPoint type; std::vector<variant> vector;};
C++ (Qt)void Append(super_vector& dst, const super_vector &src){ if (dst.type == TPointF) { PointF p1 = dst.vector[index].get<PointF>(); ... dst.vector[index] = PointF(1,2,3); } }
C++ (Qt)struct base_data{ virtual ~base_data() {}}; template <class T>struct data : public base_data{ data() {} data(const T& val) : value(val) {} T value;}; class variant{public: variant() {} template <class T> variant(const T& val) { _data = ssc::counted_ptr<base_data>(new data<T>(val)); } template <class T> void set(const T& val) { _data = ssc::counted_ptr<base_data>(new data<T>(val)); } template <class T> T get(bool *is_valid = 0) const { data<T> *d = dynamic_cast<data<T>*>(_data.get()); if (d) { if (is_valid) *is_valid = true; return d->value; } if (is_valid) *is_valid = false; return T(); } bool is_empty() const { return _data.is_null(); } private: ssc::counted_ptr<base_data> _data;}; std::vector<variant> v; v.push_back(2.3); v.push_back(std::string("hello!")); v.push_back(1); std::cout << v[0].get<double>() << std::endl; std::cout << v[1].get<std::string>() << std::endl; std::cout << v[2].get<int>() << std::endl;
if (model.mSpaceUV) { // UV имеются? // крутим UV}
C++ (Qt)if (model.mSpaceUV) { mSpaceUV->SetPoinr3F(0, (mSpaceUV->GetPoint3F(0) + mSpaceUV->GetPoint3F(1)) * 0.5); }