]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/variant.h
Make sure all classes have sensible copy semantics
[libs/core.git] / source / core / variant.h
index e00885c94210ef720c3d48c42769d99a7d3182f8..515350de6ae5543158e20b6e2c20d4ef786163fb 100644 (file)
@@ -31,7 +31,7 @@ private:
        {
                T data;
 
-               Store(d): data(d) { }
+               Store(const T &d): data(d) { }
 
                virtual const std::type_info &type_id() const { return typeid(T); }
                virtual StoreBase *clone() const { return new Store<T>(data); }
@@ -61,14 +61,28 @@ public:
                return *this;
        }
 
+private:
        template<typename T>
-       T &value() const
+       Store<typename RemoveConst<T>::Type> *get_typed_store() const
        {
                typedef typename RemoveConst<T>::Type NCT;
                Store<NCT> *s = dynamic_cast<Store<NCT> *>(store);
                if(!s)
                        throw type_mismatch(typeid(T), (store ? store->type_id() : typeid(void)));
-               return s->data;
+               return s;
+       }
+
+public:
+       template<typename T>
+       T &value()
+       {
+               return get_typed_store<T>()->data;
+       }
+
+       template<typename T>
+       const T &value() const
+       {
+               return get_typed_store<T>()->data;
        }
 
        template<typename T>