1

次のコードがあるとします。

class T; // with T::~T is virtual
class S;
class E {
  void foo() {
    /* ... */
    S s;
    T* t = new T(s);
    /* ... */
    delete t;
    /* ... */
  }
};

変更できませんE

ここで、次があると仮定します。

class S;
class A {
  class T : public ::T {
    T(S);
  }
};

またはの実装を一般的に変更せずに、 inの代わりに強制的にインスタンス化できる方法はありますか(C++03 で!) ?EA::T::TE::fooE::fooE

注: 本当に必要な場合は、E指定したもの (例: ) から継承することは許容されますAが、私はそうしないことを好みます。


一般的な注意: はい、これは設計上の欠陥のようなにおいがしますが、他のすべての (より大きな!) 部分が美しく独立してうまく動作するように、統合コードの非常に小さな部分をわずかにハッキングするという意識的な決定を下しています。設計。

4

1 に答える 1

1

2つの答えが適用されます-確かに、両方ともあなたの質問の境界を踏みにじっています:

1. テンプレート化する

template <typename T>
class E {
  void foo() {
    /* ... */
    S s;
    T* t = new T(s);
    /* ... */
    delete t;
    /* ... */
  }
};

さて、技術的には、これはE::foo の実装を変更しませんでした... (もしそうなら、それはより一般的なものを定義しただけです)。

2.邪悪なマクロ

最も不利な状況でも機能する本当にばかげた方法:

#define T A::T   // I didn't **recommend** this; it is just _a way_
于 2011-11-27T19:07:52.843 に答える