我正在尝试为类实现运算符重载,例如:
template<class T> class A{
public:
T val;
A<T>& operator=(const T& v) {
this->val = v;
return *this;
}
}
所以我能做到:
A<bool> obj;
obj = true; // instead of obj.val = true
obj = false;
这很好用。
但是,如果我这样做:
A<bool> obj;
obj = 123123; // bool is not a number!
它仍然有效!我可以以某种方式阻止它吗?
我尝试像这样标记重载explicit
:
explicit A<T>& operator=(const T& v) { ... }
但是我收到了错误:
error C2071: 'A<T>::operator =': illegal storage class
甚至可以这样做吗?
答案 0 :(得分:2)
根据评论中的建议,制作一个delete
d模板函数,该函数除了您要允许的类型之外的所有内容:
template<class T> class A
{
public:
T val;
A & operator=(T const &v) {
val = v;
return *this;
}
template<class U>
A & operator=(U const &v) = delete;
};
int main()
{
A<bool> a;
a = true;
a = 1; // error: use of deleted function
}
如果你要做很多事,你可以把繁重的工作卸下给帮助班:
template<typename T>
struct exact
{
T const &t;
exact(T const &t): t(t) {}
template<typename U>
exact(U u) = delete;
};
template<class T> class A
{
public:
T val;
A &operator=(exact<T> v) {
val = v.t;
return *this;
}
};