c ++左手赋值运算符

时间:2015-10-02 14:10:46

标签: c++ templates operator-overloading assignment-operator

我有一个班级(应该保留任何价值),如下所示:

class Value
{

    public:

        Value();
        Value(const Value& value);
        virtual ~Value();
        void operator= (const Value& value);

        template<class T>
        void operator= (T value);
...
}

现在我的问题:

为什么我不能像这样实现这个类的赋值运算符:

template<class T>
void operator=(T& value, const Value& v)
{...}

我想设计一个以下的课程:

Value v;

v = 'c';
v = 13;
v = 5.6;
int i = 5;
v = &i;

int y = v;
char b = v;

我想将任何数据类型放入其中。 目前这适用于:

v = 'c';
v = 13;
v = 5.6;

但不适用于:

int y = v;

有效的是:

int y = v.get<int>();

但这不如

那么好
int y = v;

将是

3 个答案:

答案 0 :(得分:0)

因为标准说赋值运算符必须是只有一个参数的成员函数。

13.5.3 $ 1作业[over.ass]:

  

赋值运算符应由具有一个参数的非静态成员函数实现。

答案 1 :(得分:0)

您可以像这样实现类型转换操作符

operator int()
{
    if(current_value_is_not_int)
        throw MyException("Current value is not int");

    //return int value
}

答案 2 :(得分:0)

您可以通过向类添加模板类型来轻松修复编译错误,如下所示:

class Value
{
...
        template <class T> operator T();
};

Value va;
int i = va;

我仍然相信你会发现实施&#39; boost :: any&#39;你自己很挑战,但为什么不呢? :)