C++ 重载类方法与模板

C++ 重载类方法与模板,c++,C++,我正在寻找一种优雅的方法(由最少的重复代码定义)来重载操作符,以执行以下操作: 我有一个模板类BaseSignal,它重载+=操作符,我希望能够接受许多不同的类型。例如,对于double,代码如下所示 template <class T> class BaseSignal { public: .... // Self-increment BaseSignal<T>& operator+=(const double&

我正在寻找一种优雅的方法(由最少的重复代码定义)来重载操作符,以执行以下操作:

我有一个模板类
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;
    }
    ....
但是看起来我失去了“重载”方面,因为编译器会自动为我选择正确的方法(它也只适用于实例化的原始
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;
    }
};
模板
类基频信号
{
公众:
//自我增值
模板
基本信号和操作员+=(常数U和rhs)
{
右旋;
此->获取(&rval);
此->设置(右舵+静态施法(右舵));
归还*这个;
}
};

为什么你没有让操作员成为模板?根据你在C++上的版本,你可以使用<代码> STD::任何< /Cord> @ Chipster,你如何方便地从中再次获得值?@阿空加瓜山好点。这是公平的批评。是的,我想我得在我把它拿出来的时候把它扔出去,对吗?另外,我还停留在C++14上……您定义的函数模板(恰好是类的方法)正确吗?在这种情况下,我将如何使用这个模板化操作符?我读了[and],但不清楚在使用时何时必须在尖括号中声明类。例如,如果我有一个模板函数,我需要执行
x=sum(10,20);
。对于重载运算符,如果可以推导模板(这里就是这种情况),我不也需要在其中的某个地方使用
,例如
signal+=foo;
,您不需要手动提供它们。
x=sum(10,20)
有效。对于
BaseSignal sig;sig+=4.2f;
。无需编写(丑陋的)
sig.operator+=(4.2f);
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;
    }
};