我有一个班级(应该保留任何价值),如下所示:
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;
将是
答案 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;你自己很挑战,但为什么不呢? :)