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
スマート ポインターを格納する必要があります。または非常に異なる動作を持つ良い候補です。WrapperBase
std::shared_ptr
std::unique_ptr
の有限有界集合があるPayloads
場合、訪問者パターンが機能します。
値のセマンティクスが必要な場合pImpl
、実際のペイロードを格納するパターンはoperator=
、pImpl
.
「タイプを持っていますか」と尋ねることT
は可能ですが、一般的には に似ていdynamic_cast
ます。