如何使运算符过载并且不使用"Curiously Recurring Template Pattern"和"Run Time polymorphism"

How to overload operators and not to use both "Curiously Recurring Template Pattern" and "Run Time polymorphism"

本文关键字:Template Recurring Curiously Pattern polymorphism Time Run 运算符 何使      更新时间:2023-10-16
  1. 我只想在"Number"类中overload + and = operators

  2. 我想上两个孩子的课。整数B.分数,实现"Number" class。下面是我的代码的外观。但这里我使用的是both Static and Run time polymorphism paradigm。如何避免?

代码段:

号码类别:

template<class T>
class Number
{
    virtual T& operator= (const T &) = 0;      
    virtual const T operator+ (const T &) = 0;
    virtual void display(std::ostream &) = 0;
};

整数类:

// operator "=" overloading 
Integer& Integer::operator=(const Integer &secondNumber)
{
    intValue = secondNumber.intValue;
    return *this;
}
// operator "+" overloading
const Integer Integer::operator+(const Integer &secondNumber) 
{
     Integer temp;
     temp.intValue = this->intValue + secondNumber.intValue;
     return temp;
}

此外,如果我从"Number"类中删除"template",我就不能重载+运算符,因为它返回类实例,并且我们不能有一个抽象类的实例,即"Number class"

此外,如果我不能去掉虚拟关键字,因为我希望我的孩子实现"数字类"中的方法。

请在这里给我一点指导,有没有办法在代码中不同时使用两种类型的Paradigm,即静态和动态。

您需要决定您更喜欢哪种方法,以及为什么只想使用该方法。然而,我在您的代码中没有看到编译时多态性,您只是在创建一个通用模板的多个实例。这两个实例化没有任何共同之处,除非它们也继承了一个共同的接口。

关于决定使用哪种方法,而不是看你想从代码中得到什么,我发现:你需要决定你不需要或可能不想在设计中包含哪些功能。

以下是一个非常有限的积分列表,根据您的情况,这些积分可能是好的,也可能是坏的:

编译时多态性

  • 高效;不需要虚拟调用,编译器可以很好地优化代码
  • 非常严格(没有基本定义的虚拟函数):没有派生实现,boom,没有编译
  • 基本对象(从动态角度来看)并不常见,但对于模板实例化来说是唯一的
  • 混合大量的实例化可能会产生很大的开销(你也可以进一步抽象你的设计来减轻这种情况)

动态多态性

  • 唯一的(派生的)类型包含一个公共接口
  • 一旦使用了基指针或引用,就可以进行一些优化(编译时方法可以内联当前源中定义良好且可用的所有内容,如果需要的话)
  • 除非虚拟函数是纯的:没有实现,没有担心,没有错误(编译时,您必须发现运行时错误)

我可以假设您的Number类不需要混合类型的数组(Number<int>&Number<float>)。如果是这种情况,编译时解决方案可能是合适的。但是,如果你想创建一个可以在任何形式的Number上操作的函数,那么你必须从Number中删除该模板,或者也将该函数作为模板来实现(可能会导致每个T的代码重复)。

U用更具体的需求更新您的问题,正确的方法或组合会更明显。我也会更新这个答案。

我的大部分观点来自于使用嵌入式系统。为了做出明确的决策,需要考虑系统的能力。如果你能在对用户体验几乎没有影响的情况下掠夺资源,那么让代码变得非常抽象和肉眼可见的混乱可能是不值得的。