私の前の質問によると、引数として取るメソッドで使用できるように、 a が実際に(またはおそらく)boost::shared_ptr<A>
のサブクラスであることを望みます。A
A*
A*
次のクラスを検討してください。
class A
{
public:
A(int x) {mX = x;}
virtual void setX(int x) {mX = x;}
virtual int getX() const {return mX;}
private:
int mX;
};
前の質問で、これを処理するために SharedA オブジェクトを作成することを提案しましたが、おそらくそうなります。
class SharedA : public A
{
public:
SharedA(A* a) : mImpl(a){}
virtual void setX(int x) {mImpl->setX(x);}
virtual int getX() const {return mImpl->getX();}
private:
boost::shared_ptr<A> mImpl;
};
テンプレートクラスを作成して、これらすべてを処理できるとしたら、それは大変なことです。
template <class T>
class Shared : public T
{
public:
SharedT(T* t) : mImpl(t)
{
//What kind of crazy voodoo goes here?
}
private:
boost::shared_ptr<T> mImpl;
};
これがあれば (適切なコンストラクターと共にShared<T>
)、次のことができます。
A* indestructo_A = new Shared<A>(new A(100));
A* indestructo_A_clone = new Shared<A>(indestructo_A);
delete indestructo_A
cout << "Indestructo-A back with a vengence!" << indestructo_A_clone.getX();
質問:
これは役に立ちますか?または、特に悪いコードを扱っているコーナーケースでのみそのユーティリティが使用されます。例えば:
void aFunctionYouHaveToUse(A* a) { /有用なアルゴリズムを実行してから/
a を削除します。}そのようなテンプレート化されたクラスを構築することは可能ですか? (リフレクションが必要だと思いますよね?)それを構築できるとしたら、どうやって?