我正在寻找一种优雅的方法(由最少的重复代码定义)以重载运算符以执行以下操作:
我有一个BaseSignal重载+=运算符的模板类,并且我希望能够接受许多不同的类型。例如,对于double,代码看起来像
template <class T>
class BaseSignal
{
public:
....
// Self-increment
BaseSignal<T>& operator+=(const double& rhs)
{
T rval;
this->Get(&rval);
this->Set(rval + static_cast<T>(rhs));
return *this;
}
....
Run Code Online (Sandbox Code Playgroud)
我一直在对int,long等重复这段代码。由于该值rhs仅在line中使用static_cast<T>(rhs),所以我在重复代码的同时仅更改输入参数的类型。
所以我可以模板化,例如
template <class T, class U>
class BaseSignal
{
public:
....
// Self-increment
BaseSignal<T>& operator+=(const U& rhs)
{
T rval;
this->Get(&rval);
this->Set(rval + static_cast<T>(rhs));
return *this;
}
....
Run Code Online (Sandbox Code Playgroud)
但是,这似乎使我失去了“重载”方面,因为编译器将自动为我选择正确的方法(它也仅适用U于实例化的原始类型)。
我意识到我正在尝试使用C ++实现某些非类型化的语言行为,这可能不是最聪明的事情,我只是想向一些常用的类中添加一些智能,以使后续代码变得更容易编写。
先感谢您。
你可能会做
template <class T>
class BaseSignal
{
public:
// Self-increment
template <class U>
BaseSignal<T>& operator+=(const U& rhs)
{
T rval;
this->Get(&rval);
this->Set(rval + static_cast<T>(rhs));
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)