#include <vector>
template <typename T> class Database
{
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 Object1 {};
class DerivedDatabase : public Database<DerivedDatabase>
{
friend class Database<DerivedDatabase>;
private:
// list of dataset objects
std::vector<Object1> list_;
};
class Object2 {};
class DerivedDatabase2 : public Database<DerivedDatabase2>
{
friend class Database<DerivedDatabase2>;
private:
// list of dataset objects
std::vector<Object2> list_;
};
int main()
{
DerivedDatabase d1;
d1.Size();
DerivedDatabase d2;
d2.Size();
}
I2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBEYXRhYmFzZQp7CnB1YmxpYzoKICAgIC8vIHJldHJpZXZlIHNpemUgb2YgdGhlIGRhdGFzZXQKICAgIGludCBTaXplKCkgY29uc3QgeyByZXR1cm4gQXNEZXJpdmVkKCkubGlzdF8uc2l6ZSgpOyB9CnByaXZhdGU6CiAgICBjb25zdCBUJiBBc0Rlcml2ZWQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUJj4oKnRoaXMpOyB9CiAgICBUJiBBc0Rlcml2ZWQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxUJj4oKnRoaXMpOyB9Cn07CgpjbGFzcyBPYmplY3QxIHt9OwoKY2xhc3MgRGVyaXZlZERhdGFiYXNlIDogcHVibGljIERhdGFiYXNlPERlcml2ZWREYXRhYmFzZT4KewogICAgZnJpZW5kIGNsYXNzIERhdGFiYXNlPERlcml2ZWREYXRhYmFzZT47CnByaXZhdGU6CiAgICAvLyBsaXN0IG9mIGRhdGFzZXQgb2JqZWN0cwogICAgc3RkOjp2ZWN0b3I8T2JqZWN0MT4gbGlzdF87Cn07CgpjbGFzcyBPYmplY3QyIHt9OwoKY2xhc3MgRGVyaXZlZERhdGFiYXNlMiA6IHB1YmxpYyBEYXRhYmFzZTxEZXJpdmVkRGF0YWJhc2UyPgp7CiAgICBmcmllbmQgY2xhc3MgRGF0YWJhc2U8RGVyaXZlZERhdGFiYXNlMj47CnByaXZhdGU6CiAgICAvLyBsaXN0IG9mIGRhdGFzZXQgb2JqZWN0cwogICAgc3RkOjp2ZWN0b3I8T2JqZWN0Mj4gbGlzdF87Cn07CgppbnQgbWFpbigpCnsKICAgIERlcml2ZWREYXRhYmFzZSBkMTsKICAgIGQxLlNpemUoKTsKICAgIERlcml2ZWREYXRhYmFzZSBkMjsKICAgIGQyLlNpemUoKTsKfQo=