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);
}
a 的用户WrapperBase
,如果他们想设置/获取有效负载,需要知道有效负载的类型是什么。如果您不知道,您可以使用dynamic_cast<Wrapper<Payload>*>
它来确定给定的是否是特定种类。WrapperBase
这没有值语义,因此您需要存储一个vector
智能指针WrapperBase
而不是实际实例。 std::shared_ptr
或者std::unique_ptr
是行为非常不同的优秀候选人。
如果存在 的有限有界集Payloads
,则访问者模式可以工作。
如果您需要值语义,pImpl
存储实际有效负载的模式可以使用手动operator=
克隆pImpl
.
可以询问“您是否持有类型T
”,但通常类似于dynamic_cast
.