gpt4 book ai didi

c++ - 变体实现(可变参数模板)C++

转载 作者:行者123 更新时间:2023-11-30 03:56:00 24 4
gpt4 key购买 nike

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

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...> .

关于c++ - 变体实现(可变参数模板)C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28732816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com