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ます。