Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >使用模板的操作符重载

使用模板的操作符重载
EN

Stack Overflow用户
提问于 2018-02-23 07:51:04
回答 1查看 398关注 0票数 0

我正在编写一个名为Double的类,它扩展了c++中内置的'double‘类型。它有一个类型为“double”的数据成员。对于类Double,我需要重载许多基本算术运算符,如"+“、"-”、"*“、"/”。例如,"+“运算符以这种方式重载:

代码语言:javascript
代码运行次数:0
复制
Relation<Double>* operator+ (Double &d2)   
// Relation is a abstract class template.
{
   /*
   ...code that do something else.
   */ 
   return new Plus<Double>(this, &d2);   // Plus is derived from Relation.
}                             
// Double + Double returns a Relation pointer.

"-“操作符以同样的方式快速超载:

代码语言:javascript
代码运行次数:0
复制
Relation<Double>* operator- (Double &d2)
{
   /*
   ...code that do something else but the same as above.
   */ 
   return new Minus<Double>(this, &d2);
}

实际计算由关系类中的成员函数完成。操作符体的唯一区别是对象initialized(Plus减去)。对于带有两个操作数的操作符,我应该总是这样做重载,这是重复的,不太好。因此,模板函数出现在我的脑海中。但问题是,我可以传递+减号作为模板参数,但不能传递运算符。如何制作模板或使用其他方法来重载这些操作符?

EN

回答 1

Stack Overflow用户

发布于 2018-02-23 15:46:25

是的,操作符重载可能是一个痛苦的源代码重复代码,请参阅这一建议符合标准来缓解它。

现在我唯一能想到的就是这样的事情:

代码语言:javascript
代码运行次数:0
复制
template<typename T>
struct OperatorMinus {
  static T doIt(T const& lhs, T const& rhs) { return lhs - rhs; };
}

template<typename T>
struct OperatorPlus {
  static T doIt(T const& lhs, T const& rhs) { return lhs + rhs; };
}

template<typename T, typename U>
class Operator: public Relation<T>
  public:
  Operator(T const& lhs, T const& rhs): _lhs(lhs), _rhs(rhs) {}

  T doIt() override {
    return U::doIt(_lhs, _rhs);
  }

  private:
  T _lhs;
  T _rhs;
};

Relation<Double>* operator+ (Double &d2)   
{
   return new Operator<Double, OperatorPlus<Double>>(this, &d2);
}   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48951635

复制
相关文章
操作符重载
游客是你,风景是我,无法避免,让你经过。——《稀客》 中文文档 kotlin里我们可以进行操作符重载,以达到对象+对象、-对象这样的操作: // 定义一个类 data class Point(val x: Int, val y: Int) // 对其进行操作符重载,让其能够使用-Point()语法 operator fun Point.unaryMinus() = Point(-x, -y) val point = Point(10, 20) println(-point) // 输出“Poi
阿超
2022/09/29
3330
操作符重载
【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )
对集合使用 " + " 运算符 , 其作用相当于 调用 plus 方法 , " + " 符号两侧的值就是 plus 方法的
韩曙亮
2023/03/30
1.2K0
【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )
Groovy重载操作符
最近在读《Groovy in action》一本书重新复习了Groovy的一些语法特性,迷恋上这个重载操作符的功能,爽的不要要的。分享一个Demo。
FunTester
2020/01/10
7400
PHP 中的操作符重载
操作符重载是一种语法糖,它在 C++、Python、Kotlin 等编程语言中被广泛使用。这一特性有助于我们写出更加整洁、表述力更强的代码,尤其是当我们对某些对象进行数学操作时。
桶哥
2019/06/04
1.5K0
【Groovy】map 集合 ( map 集合操作符重载 | - 操作符重载 | 代码示例 )
对 map 集合 使用 " - " 操作符 , 相当于调用了 map 集合的 minus 方法 , 该方法传入
韩曙亮
2023/03/30
7170
【Groovy】map 集合 ( map 集合操作符重载 | - 操作符重载 | 代码示例 )
C++重载操作符
什么叫重载操作符?这要先说什么是操作符,其实最简单的:+、-、*、/、<<就都是操作符,这些也是很常见的重载操作符。
Cloudox
2021/11/23
3270
内存操作符重载(new/delete)
内存操作符 new 和 delete 系统本身就提供了非常稳固的方法,很少会有情况用到自己重载的 new 和 delete,除非是想实现什么特别的功能,比如在申请内存后自动填入什么数据等等,当然这并不是本文讨论的重点,本文的重点是记录如何重载这两个操作符。
我与梦想有个约会
2023/10/20
1010
C++ 重载操作符
C++ 几乎可以重载全部的运算符,而且只能够重载C++中已经有的。 · 不能重载的运算符:“.”、“.*”、“::”、“?:” · 重载之后运算符的优先级和结合性都不会改变。 可以重载为类的非静态成员
雪碧君
2023/02/15
2830
Kotlin Vocabulary | 操作符重载
当我们在处理可以添加、删除、比较或者连接的类型时,我们通常需要写很多冗长和重复的代码。但在 Kotlin 中,我们可以借助 操作符重载,为这些类型写出更具表现力和简洁的代码。
Android 开发者
2022/09/23
3880
Kotlin Vocabulary | 操作符重载
【Groovy】map 集合 ( map 集合操作符重载 | + 操作符重载 | 代码示例 )
对 map 集合使用 " + " 操作符 , 操作符两侧都是 map 集合 , 调用的是 map 集合的 plus 方法 , plus 函数有
韩曙亮
2023/03/30
7490
【Groovy】map 集合 ( map 集合操作符重载 | + 操作符重载 | 代码示例 )
【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ << “ 操作符重载 | 使用集合中的 “ << “ 操作符添加一个元素 | 使用集合中的 “ << “ 操作符添加一个集合 )
对集合使用 " << " 运算符号 , 该符号右边的值为 集合元素值 , 该操作相当于调用了 Collection 的 leftShift 方法 ;
韩曙亮
2023/03/30
2.9K0
【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ << “ 操作符重载 | 使用集合中的 “ << “ 操作符添加一个元素 | 使用集合中的 “ << “ 操作符添加一个集合 )
c++操作符重载
定义 运算符重载的 实质 是 函数的重载 使用意义 赋予操作符更多的意义,同一个运算符,对不同类型的操作数,所发生的行为不同是 程序更加简洁 写法格式:返回值 operator运算符(参数列表){} 重载的要求: 1、内置类型的操作符不能被重载 2、不能为内置类型定义其他的操作符 3、操作符重载不能改变操作符的优先级 4、操作数个数不能改变 重载方式: 1、类的成员方法 2、类的有友元方法 3、全局方法 注意: ++a和a++的重载区别。a++的重载方法中多一个占位参数 最好不好重载&&和||。因为无
用户2929716
2018/08/23
4420
C++赋值操作符重载
赋值操作符是一个使用频率最高的操作之一,通常情况下它的意义十分明确,就是将两个同类型的变量的值从一端(右端)传到另一端(左端)。但在以下两种情况下,需要对赋值操作符进行重载。 一是赋值号两边的表达式类型不一样,且无法进行类型转换。 二是需要进行深拷贝。
恋喵大鲤鱼
2019/02/22
5940
运算符重载 += 操作符
上几篇文章我们介绍了加号运算符的重载,实现了两个类之间相加得出我们想要的结果,本文将介绍+=操作符的重载,使两个类的对象可以使用+=运算符来进行运算。其中要注意的是返回值为引用(&)的重要性。
我与梦想有个约会
2023/10/20
2070
运算符重载 += 操作符
函数模板与同名的非模板函数不可以重载(重载的定义)
关于函数的重载机制,是一个比较复杂的问题,其中涉及到了优先级定义和最佳匹配等问题,如果要阐述清楚,恐怕不是一两篇文章就能说的明白。但是如果掌握了一些常用的“规律”,对于了解程序对重载函数是如何进行选择也有很大的好处,本文尝试将自己理解的知识,结合下面简单的例子简略的说说函数重载机制,文章的摘录部分列出了一些关于程序如何选择重载函数的规则。: )
全栈程序员站长
2022/07/26
8780
C++ 类型转换操作符重载
示例template <typename T>operator T () const{}Poco库中的使用Var.hPoco::Dynamic::Vartemplate <typename T>operator T () const{ VarHolder* pHolder = content(); if (!pHolder) throw InvalidAccessException("Can not convert empty value."); if (typeid
code-x
2022/08/31
4760
使用操作符重载,生成ORM实体类的SQL条件语句
ORM框架的一个不可或缺的功能就是根据实体类,生成操作数据库的SQL语句,这其中,最难处理的就是那些复杂的SQL条件比较语句。比如,有下面这样一个SQL语句: SELECT [id],[BankCode],[CityCode],[FundCode],[FundName],[FundReviews],[EndDagte],[addDate]  FROM [FundReviews]     WHERE  (               ([CityCode]=@CP1 OR [BankCode]=@CP2)  
用户1177503
2018/02/26
8070
C++赋值操作符重载简介
赋值操作符是一个使用频率最高的操作之一,通常情况下它的意义十分明确,就是将两个同类型的变量的值从一端(右端)传到另一端(左端)。但在以下两种情况下,需要对赋值操作符进行重载。 一是赋值号两边的表达式类型不一样,且无法进行类型转换。 二是需要进行深拷贝。
恋喵大鲤鱼
2018/08/03
7630
运算符重载 - (负号)操作符
本文介绍重载符号操作符 -,他与减号操作符是一样的,那我们该如何区分开呢?其实符号操作符属于单目运算符,操作数只有一个。而减号操作符则是双目运算符,操作符需要两个才可以,这样我们在重载的时候,只要将控制了操作数,系统就知道我们到底是在重载哪个操作符了。
我与梦想有个约会
2023/10/20
3320
EasyC++40,模板重载
函数模板可以使得同一个函数对不同类型使用,非常地方便。但有的时候类型不同,只是通过模板是没办法解决的, 可能逻辑上也会有所区别,这个时候只是使用模板是无法解决的。
TechFlow-承志
2022/08/26
2160

相似问题

重载模板操作符

16

操作符重载模板

11

模板重载ostream操作符

22

操作符重载模板参数

11

模板和重载操作符<<

510
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文