2

質問は、MS Visual C++ 11 で開発されたコードに関するもので、STL にのみアクセスでき、Boost にはアクセスできません。

大まかにこのヘッダーを持つラッパーテンプレートクラスがあります:

template <typename Payload>
class Wrapper {
  Payload p;
  std::string src;
  Wrapper( std::string, Payload );

  Payload get();      // returns payload
  void set(Payload);  // replaces payload
  void operator ()(); // uses payload
}

Payloadポインター、int、さらには重いオブジェクトなど、何でもかまいません。

後で、Wrappers は - のようにコンテナーに入れる必要がありstd::vectorますが、特定のパラメーターの型に関係なく。コンテナには同種の要素が必要なので、それは私に問題を引き起こします。

KennyTM からこのような基本クラスの提案を試しましたが、メソッドget()にいくつかの問題が発生しset()、その回答で提案されたパターンで使用すると要素が基本クラスのように見えるため、ベクトルから使用する場合はキャスト (?) が必要です。

4

2 に答える 2

5

そのためには、ある種のタイプ消去を使用する必要があります。最も基本的なもの (基本型を提供し、基本型へのポインターによって要素を格納する) から、選択できる boost::any のような凝ったソリューションまで (ブーストがないと述べたことは知っていますが、いつでも実装を確認できます)。 . 別の方法として、ペイロードのセットが既知で比較的小さい場合は、バリアントアプローチ (boost::variant に似ています) を使用できますが、1 回の使用で実装するのは難しい場合があります。

于 2012-12-13T18:14:08.200 に答える
3
template<typename Payload>
struct Wrapper;

struct WrapperBase {
  std::string src;
  WrapperBase( std::string s ):src(s) {}
  template<typename Payload>
  Payload get() const;
  template<typename Payload>
  void set(Payload);
  virtual void operator ()() = 0; // uses payload
};

template <typename Payload>
struct Wrapper {
  Payload payload;
  Wrapper( std::string s, Payload p ):WrapperBase(s),payload(p) {}

  Payload get() const { return payload; };      // returns payload
  void set(Payload p) { payload = p; };  // replaces payload
  virtual void operator()() override; // todo
}

template<typename Payload>
Payload WrapperBase::get() const {
  Assert(dynamic_cast<Wrapper<Payload> const*>(this));
  return static_cast<Wrapper<Payload> const*>(this)->get();
}
template<typename Payload>
void WrapperBase::set(Payload p) {
  Assert(dynamic_cast<Wrapper<Payload>*>(this));
  static_cast<Wrapper<Payload>*>(this)->set(p);
}

のユーザーはWrapperBase、ペイロードを設定/取得する場合、ペイロードのタイプを知る必要があります。わからない場合はdynamic_cast<Wrapper<Payload>*>、与えられたものが特定の種類であるかどうかを調べるために使用できます。WrapperBase

これには値のセマンティクスがないため、実際のインスタンスではなく vectorスマート ポインターを格納する必要があります。または非常に異なる動作を持つ良い候補です。WrapperBasestd::shared_ptrstd::unique_ptr

の有限有界集合があるPayloads場合、訪問者パターンが機能します。

値のセマンティクスが必要な場合pImpl、実際のペイロードを格納するパターンはoperator=pImpl.

「タイプを持っていますか」と尋ねることTは可能ですが、一般的には に似ていdynamic_castます。

于 2012-12-13T18:36:53.790 に答える