1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
template<class T>
struct IRefVal {
IRefVal()=default;
virtual T& get() =0;
virtual IRefVal* clone() const = 0;
virtual void set(const T& v) = 0;
virtual ~IRefVal(){}
protected:
IRefVal(const IRefVal&){}
IRefVal& operator=(const IRefVal&)
{ return *this; }
};
template<class T>
struct Ref : IRefVal<T> {
Ref(const std::reference_wrapper<T>& r)
: ref(r)
{}
T& get()
{ return ref.get(); }
IRefVal<T>* clone() const
{ return Ref<T>(*this); }
void set(const T& v) {
ref = v;
}
private:
std::reference_wrapper<T> ref;
};
template<class T>
struct Val : IRefVal<T> {
Val(const T& t)
: val(t)
{}
void set(const T& v) {
val = v;
}
T& get()
{ return val; }
IRefVal<T>* clone() const
{ return new Val(*this); }
private:
T val;
};
template<class T>
struct Pointer : IRefVal<T> {
Pointer(const T* t)
: val(t)
{}
void set(const T& v) {
val = &v;
}
T& get()
{ return val; }
IRefVal<T>* clone() const
{ return new Pointer<T>(*this); }
private:
T val;
};
template<class T>
struct RefVal {
RefVal() = default;
RefVal(const T& t)
{
rv = new Val<T>(t);
}
RefVal(const std::reference_wrapper<T>& r)
{
rv = new Ref<T>(r);
}
RefVal(const T*& p)
{
rv = new Pointer<T>(p);
}
RefVal(const RefVal& rhs)
{
rv = rhs.rv->clone();
}
RefVal& operator=(const RefVal& rhs)
{ rv=rhs.rv->clone(); return *this; }
void operator= (const T& t) {
rv->set(t);
}
T& get() const
{ return rv->get(); }
private:
IRefVal<T>* rv;
}; |
Partager