С++ Укажите тип переменной posteriori в производном классе

У меня есть две базы данных различных типов объектов с некоторыми общими функциями, поэтому я решил создать родительский класс с определениями общих функций. Идея состоит в том, что эти функции должны выполнять одни и те же операции, даже если тип объектов отличается. Глупый пример:

class Database
{
public:
 // retrieve size of the dataset
 int Size() const {return list_.size();}
};

class DerivedDatabase : public Database
{
private:
 // list of dataset objects
 std::vector<object1> list_;
};

class DerivedDatabase2: public Database
{
private:
 // list of dataset objects
 std::vector<object2> list_;
};
</object2></object1>

Одним из решений является определение функции как virtual Size() const =0 а затем производные классы переопределяют ее. Однако идея состоит в том, чтобы она уже реализована, когда мне нужно создавать новые типы баз данных. Есть ли способ указать апостериорный тип переменной в производных классах? Две производные базы данных по своей сути различны, и они ведут себя совершенно по-другому, за исключением некоторых функций, которые являются общими. Таким образом, они должны быть отдельными объектами

2 ответа

Вы можете использовать CRTP для факторизации кода, например:

template <typename t=""> class Database
{
// T should have a container named list_
public:
 // retrieve size of the dataset
 int Size() const { return AsDerived().list_.size(); }
private:
 const T& AsDerived() const { return static_cast<const t&="">(*this); }
 T& AsDerived() { return static_cast<t&>(*this); }
};
</t&></const></typename>

А потом

class DerivedDatabase : public Database<deriveddatabase>
{
 friend class Database<deriveddatabase>;
private:
 std::vector<object1> list_;
};

class DerivedDatabase2 : public Database<deriveddatabase2>
{
 friend class Database<deriveddatabase2>;
private:
 std::vector<object2> list_;
};
</object2></deriveddatabase2></deriveddatabase2></object1></deriveddatabase></deriveddatabase>

Обратите внимание, что DerivedDatabase и DerivedDatabase2 не имеют общего базового типа здесь

Живой пример


Конечно, какой template для:

class Database {
 virtual int size() = 0;
public:
 // retrieve size of the dataset
 int Size() const {return size();}
}

template<typename t="">
class DerivedDatabase: public Database {
 std::vector<t> list_;
 int size() const {return list_.size();}
}
</t></typename>

licensed under cc by-sa 3.0 with attribution.