如何使运算符过载并且不使用"Curiously Recurring Template Pattern"和"Run Time polymorphism"
How to overload operators and not to use both "Curiously Recurring Template Pattern" and "Run Time polymorphism"
-
我只想在"Number"类中
overload + and = operators
。 -
我想上两个孩子的课。整数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用更具体的需求更新您的问题,正确的方法或组合会更明显。我也会更新这个答案。
我的大部分观点来自于使用嵌入式系统。为了做出明确的决策,需要考虑系统的能力。如果你能在对用户体验几乎没有影响的情况下掠夺资源,那么让代码变得非常抽象和肉眼可见的混乱可能是不值得的。
- 表示"accepting anything for this template argument" C++概念的通配符
- 传递给std::function template的template参数究竟代表什么
- 在template中使用std::variant的template函数
- C++ template for QList
- C++ - 为什么这里需要'template'关键字?
- 使用"std::enable_if_t" "function template has already been defined"
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- C++ class template
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 为什么编译器说"candidate template ignored: couldn't infer template argument 'InputIterator'"?
- 为什么在这种情况下我需要 .template
- std::span constructor, libcxx vs libstdc++, template vs non-
- 模板函数参数到模板函数的"candidate template ignored: could not match ..."
- MacOS 上的 LLVM - 标准文件 iosfwd 中未知类型名称'template'
- std::get like (partial) template specialization
- 实现多类型算术运算符时如何解决"template argument deduction/substitution failure"
- 如何使用"Curiously recurring template"模式
- 如何使运算符过载并且不使用"Curiously Recurring Template Pattern"和"Run Time polymorphism"
- 使用"Curiously Recurring Template Pattern"的增量数字
- "Curiously Recurring Template Pattern"的实际用途