基于TypeName的专业分配运算符重载
Overloading specialized assignment operator based on typename
好吧,标题是一个嘴巴且希望足够具体的,但是我遇到了一个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;
};
因此,专业化非常简单。这是QString
和int
的:
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用作总和的参数,编译器甚至能够自动推导数据类型,而无需在角度括号内明确指定它。"
>很抱歉,如果我错过了重点,但认为这可能会有所帮助。
- 正在尝试重载二进制搜索树分配运算符
- 自定义先决条件对移动分配运算符有效吗
- C++ - 没有自定义交换功能的移动分配运算符?
- 强制复制分配超过移动分配运算符
- 在之后仍需要使用源对象时调用父移动分配运算符
- c++ 使用动态分配运算符反向数组元素
- 当存在用户定义的移动分配运算符时,已删除模板移动分配运算符
- C++ - 从移动分配运算符调用复制分配
- 不工作 复制分配运算符
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- 返回对象如何与分配运算符一起工作
- 下标是否在分配运算符的右侧进行评估
- C++分配适用于已删除的分配运算符
- 用于删除复制/移动分配运算符的有效签名
- 使用新放置作为复制分配运算符不好吗?
- C++ - 父级中的 CRTP 分配运算符不起作用
- 复制派生类的分配运算符
- 未定义 Lambda 复制分配运算符
- 为什么标准在移动分配运算符中使用交换?
- 正确编写复制构造函数和分配运算符的方法