C++双向运算符,这是可能的吗
C++ two-way operators, is it possible?
例如,我们有这样的类:
class my_class
{
public:
friend my_class operator* (const my_class&, int a);
friend my_class operator* (int a, my_class&);
};
my_class operator* (int a, my_class&)
{
// do my_class * a
}
my_class operator* (int a, my_class&)
{
// do a * my_class
}
有可能只做一个操作员*来做这两个操作员做的事情吗?
谢谢!
您不能这样做。然而,您可以实现一个,并简单地从另一个调用它:
my_class operator *(const my_class &l, int r) {
// implement the actual operator here.
}
my_class operator *(int l, const my_class &r) {
return r * l;
}
(请注意,不能将后一个函数作为类的一部分来实现。必须在外部实现。第一个函数可以作为实例方法来实现,因为它的第一个参数是类类型的。)
您可以通过使用另一个来实现一个:
my_class operator*(int lhs, const my_class& rhs)
{
return rhs * lhs;
}
如果运算本身是可交换的。情况并非总是如此,所以要小心。
还有一些库可以帮助您使用某些运算符。如果你有
my_class mc, a, b;
a = mc * 1;
b = 1 * mc;
你可能也想做一些类似的事情
mc *= 1;
在这种情况下,您只能实现
my_class& my_class::operator*=( int v );
您可以使用Boost.Operators或df.Operators自动生成其他运算符。
示例:
struct my_class
: df::commutative_multipliable< my_class, int >
{
// ...
my_class& operator*=( int v )
{
// ... implement me!
return this;
}
// ...
};
在本例中,您再次只实现一个操作,其余操作使用公共模式生成。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<