この質問に触発されて、私は反対を達成するためのトリック(SFINAEのような)があるかどうか知りたいです。
編集:例を追加
私はこのようなものを持っています(それは多くの詳細を持っているので非常に単純化されています):
#include <iostream>
class Base {
public:
Base(){}
virtual ~Base(){
}
void initialize() { implementation(); }
private:
virtual void implementation() = 0;
};
class Derived : public Base {
private:
virtual void implementation() { std::cout << "initialization" << std::endl;}
};
int main() {
std::unique_ptr<Base> b(new Derived());
b->initialize();
return 0;
}
initializeメソッドを呼び出す必要があります。
しかし、初期化メソッドをBaseコンストラクター内に置くと、純粋仮想メソッドが呼び出されます。誰かが構築されたオブジェクトを不適切に使用するのを防ぐ方法があるかどうか知りたいです。
編集:私の「解決策」:
#include <iostream>
class Base {
public:
virtual ~Base(){
}
Base() {};
private:
void initialize() { implementation(); }
virtual void implementation() = 0;
template<class DerivedType> friend Base *factory();
};
class Derived : public Base {
private:
Derived() {}
virtual void implementation() { std::cout << "initialization" << std::endl;}
template<class DerivedType> friend Base *factory();
};
template<class DerivedType>
static Base *factory(){
Base *b = new DerivedType();
b->initialize();
return b;
}
int main() {
std::unique_ptr<Base> b(factory<Derived>());
return 0;
}