基于TypeName的专业分配运算符重载

Overloading specialized assignment operator based on typename

本文关键字:分配 运算符 重载 TypeName 基于      更新时间:2023-10-16

好吧,标题是一个嘴巴且希望足够具体的,但是我遇到了一个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:第一个声明会汇编WITOUT错误,但添加相同的声明&lt; int&gt;由于仅返回类型有所不同,因此使其模棱两可。

编译器是gcc 4.8.2,with -stdc = c 11启用。

,尽管帕迪的答案似乎正确,但在我看来,除了qString和QString和INT之外,在我看来对QVariant所能拥有的所有类型都可以保存的所有类型)。

一个更容易的解决方案是,以一种从QVariant提供的内置转换中受益的方式,将分配运算符专业化一次:

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

原始类定义有点错误,正如Kirill Kobelev在您的问题评论部分中指出的那样。现在,让我们修复它,还添加另一个operator=

template <typename T>
class Property
{
public:
    Property & operator=( const T & src )
    {
        m_data = src;
        return *this;
    }
    // This one must be specialized
    Property & operator=( const QVariant & src );
    const T & operator() const
    {
        return m_data;
    }
private:
    T m_data;
};

因此,专业化非常简单。这是QStringint的:

template <>
Property<QString> &
Property<QString>::operator=( const QVariant & src )
{
    return operator=( src.toString() );
}
template <>
Property<int> &
Property<int>::operator=( const QVariant & src )
{
    return operator=( src.toInt() );
}

现在,您可以自由地将QVariant值直接分配给提供该专业化的任何Property。如果您尝试在不专门化的课程上进行此错误,那么您将获得错误。

我没有发表评论的声誉,也没有要求洞察力的专业知识,因此请不要将其作为"答案"。

但是您的问题让我想起了有关CPP,Overloads和功能的课程,请访问http://www.cplusplus.com/doc/tutorial/functions2/。

摘录:

"在上面的示例中,我们使用了两次函数模板总和。第一次使用类型INT参数,第二次带有类型double的参数。编译器已实例化,然后每次调用适当版本功能。

因此,结果将是与参数A和B相同类型的变量,以及函数返回的类型。在这种特定情况下,通用类型T用作总和的参数,编译器甚至能够自动推导数据类型,而无需在角度括号内明确指定它。"

>

很抱歉,如果我错过了重点,但认为这可能会有所帮助。