我有两个不同类型对象的数据库,它们有一些共同的功能,所以我想创建一个带有常用函数定义的父类。这个想法是即使对象的类型不同,这些函数也必须执行相同的操作。一个愚蠢的例子:
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_;
};
一种解决方案是将函数定义为virtual Size() const =0
,然后让派生类覆盖它。但是我的想法是在必须创建新类型的DataBase时已经实现了它。有没有办法在派生类中指定变量类型的后验?两个派生的数据库本质上是不同的,除了一些常见的功能外,它们的行为完全不同。因此,它们必须是单独的对象
答案 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); }
};
然后
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_;
};
请注意,DerivedDatabase
和DerivedDatabase2
在此处不共享公共基本类型
答案 1 :(得分:1)
当然,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();}
}