变量实现(变量模板)C++



我正在尝试实现一个变体类,但我遇到了递归函数的问题:

template<typename Visitor, typename... Types>
class VariantVisitor;
template<typename... Types>
class Variant
{
    template <typename V, typename... types>
    friend class VariantVisitor;
public:
    struct holder
    {
        virtual ~holder() {}
    };
    template <typename T>
    struct impl : public holder
    {
        impl(const T& t) : val(t) {}
        T get() const { return val; }
        T val;
    };
    Variant() : mHolder(nullptr) {}
    template <typename T>
    Variant(const T& t) 
    {
        mHolder = new impl<T>(t);
    }
    Variant(const Variant<Types...>& v) : mHolder(nullptr)
    {
        copy<Types...>(v);
    }
    ~Variant()
    {
        delete mHolder;
    }
    template <typename T>
    Variant<Types...>& operator = (const T& t)
    {
        if (!mHolder) {
            mHolder = new impl<T>(t);
            return *this;
        }
        _ASSERT(typeid(*mHolder) == typeid(impl<T>));
        static_cast<impl<T>*>(mHolder)->val = t;
        return *this;
    }
    Variant<Types...> &operator = (const Variant& v)
    {
        copy<Types...>(v);
        return *this;
    }
    template <typename T>
    T Get() const
    {
        _ASSERT(mHolder && typeid(*mHolder) == typeid(impl<T>));
        return static_cast<impl<T>*>(mHolder)->get();
    }
    template<typename T>
    bool Is() const
    {
        return (mHolder && typeid(*mHolder) == typeid(impl<T>));
    }
private:
    template <typename T>
    void copy(const Variant<Types...>& v)
    {
        if (mHolder) delete mHolder;
        impl<T>* ptr = static_cast<impl<T>*>(v.mHolder);
        mHolder = new impl<T>(*ptr);
    }
    template <typename T, typename...types>
    void copy(const Variant<Types...>& v)
    {
        if (!Is<T>())
            return copy<types...>(v);
        copy<T>(v);
    }
    holder* mHolder;
};

Visual C++2013表示,对这条线有一个模糊的调用:

copy<T>(v);

我对可变模板很陌生,但我认为它应该区分两个复制函数的类型数量,不是吗?那么,为什么它们都是过载呢?当然,我该怎么解决这个问题呢?

参数包可以为空。因此,编译器无法区分

template <typename T> void copy(const Variant& v); // with T = T

template <typename T, typename...types> 
void copy(const Variant& v); // with T = T, types = empty pack

修复方法是使第二个版本只匹配两个或多个模板参数:

template <typename T, typename T2, typename...types> 
void copy(const Variant& v);

正文将需要更新以使用copy<T2, types...>(v)

注意,在类Variant的定义中,您可以只写Variant,它将意味着Variant<Types...>

最新更新