現在、既存のクラスのラッパーを作成しています。既存のクラスを直接使用するクライアント コードを変更せずにラッパーを作成する最善の方法は何ですか?
class A
{
public:
void foo() {}
};
template<typename T>
class Wrapper
{
// ...other wrapper data/functionality...
private:
T myObject;
};
main()
{
Wrapper<A> wrappedA;
wrappedA.foo();
}
msvc でコンパイルがエラー C2039 で失敗する: 'foo' : is not a member of 'Wrapper'
メインのコードを変更せずにテンプレート ラッパー クラスを機能させる最善の方法は何ですか?
- 選択演算子。オーバーロードできません
- 型 T へのキャスト演算子を記述しても、コンパイラは選択を行う前にキャストを試行しないため、役に立ちません。
- 内部の myObject メンバーを返す get 関数を作成できますが、main のクライアント コードを書き直す必要があります。これは、記述しようとしている新しいラッパー クラスを使用せずに myObject を直接使用する既存のコードが多数ある場合には、適切ではありません。
編集
- myObject を直接使用する既存のクライアント コードを変更せずに、myObject にラッパー クラスを記述したいと考えています。
- A::foo() は、他の型 T に T::foo() がない可能性があるため、ラッパーに持ち込むことはできません。