テンプレート化された仮想メンバー関数は C++ ではサポートされていませんが、理想的なシナリオがあります。誰かがこれを達成する方法についてアイデアを持っているかどうか疑問に思っています。
#include <iostream>
class Foo {
public:
virtual void bar(int ){}
// make a clone of my existing data, but with a different policy
virtual Foo* cloneforDB() = 0;
};
struct DiskStorage {
static void store(int x) { std::cout << "DiskStorage:" << x << "\n"; }
};
struct DBStorage {
static void store(int x) { std::cout << "DBStorage:" << x << "\n"; }
};
template<typename Storage>
class FooImpl : public Foo {
public:
FooImpl():m_value(0) {}
template<typename DiffStorage>
FooImpl(const FooImpl<DiffStorage>& copyfrom) {
m_value = copyfrom.m_value;
}
virtual void bar(int x) {
Storage::store(m_value);
std::cout << "FooImpl::bar new value:" << x << "\n";
m_value = x;
}
virtual Foo* cloneforDB() {
FooImpl<DBStorage> * newfoo = new FooImpl<DBStorage>(*this);
return newfoo;
}
int m_value;
};
int main()
{
Foo* foo1 = new FooImpl<DiskStorage>();
foo1->bar(5);
Foo* foo2 = foo1->cloneforDB();
foo2->bar(21);
}
ここで、Foo 実装を複製したいが、別の Storagepolicy を使用する場合は、そのような各実装を明示的に記述する必要があります。
cloneforDB()
cloneforDisk()
テンプレート パラメーターを使用すると、それが簡単になります。誰でもこれを行うためのよりクリーンな方法を考えることができますか? 明らかに不自然な例であるため、例ではなくアイデアに注目してください。