gpt4 book ai didi

c++ - 基于类型名重载专门的赋值运算符

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

好吧,标题有点冗长,希望足够具体,但我遇到了一个 C++ 问题,我认为这是可能的,我似乎找不到正确的语法。

我有一个简单的基于模板的属性类:

template <typename T>
class Property
{
public:

Property<T> &operator = (const T &src)
{
m_data = src;
return *this;
};

operator const T& () const
{
return m_data;
}

private:
T m_data;
};

我需要从 QVariant 中赋值,这也是一种属性,但没有模板。目前我在分配时显式地引用值:

Property<QString> p1;
Property<int> p2;

p1 = var1.toString();
p2 = var2.toInt();

这可行,但很乏味,我相信编译器可以为我完成这项工作。因此,我尝试根据属性的类型名 实现专门的赋值运算符;换句话说,如果模板特化基于 QString 使用一个函数,如果它基于 int 使用另一个函数,等等。

我试过这样的事情:

Property<QString> &operator = (const QVariant &ref)
{
m_data = ref.toString ();
return *this;
};

或者...

template <typename int> &Property<int>::operator = (const QVariant &ref)
{
m_data = ref.toInt ();
return *this;
};

或者...

template<> Property<T> &Property<QString>::operator = (const QVariant &ref)
{
m_data = ref.toString ();
return *this;
}

..在类声明的内部和外部都无济于事。我收到诸如“预期的嵌套名称说明符”、“参数声明中的两种或多种数据类型”之类的错误。

任何指向正确语法的指针都将不胜感激!

PS:第一个声明编译时没有错误,但是为 添加相同的声明会使它变得不明确,因为只有返回类型不同。

编译器是启用了 --stdc=c++11 的 GCC 4.8.2。

最佳答案

尽管 paddy 的答案似乎是正确的,但在我看来将它概括起来似乎很乏味(除了 QString 和 int 之外,对 QVariant 可以容纳的所有类型实现一个专门的赋值运算符)。

一个更简单的解决方案是一次性专门化赋值运算符,以一种受益于 QVariant 提供的内置转换的方式:

Property& operator= (const QVariant& src)
{
assert(src.canConvert<T>());
m_data = src.value<T>();
return *this;
}

关于c++ - 基于类型名重载专门的赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40985385/

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