【问题标题】:How to shorthand non-commutative multiplication?如何简写非交换乘法?
【发布时间】:2020-11-28 20:06:46
【问题描述】:

有没有用 C++ 编写非交换变量乘法的简写?

例如,对于交换变量,我们可以这样做:

a = a * b;
a *= b;    // same as the above

但是对于非交换变量,我们不能:

a = a * b; // #1
a = b * a; // #2 different than above

a *= b;  // same as #1
// ???   // shorthand to #2?

可以简写#2吗?

【问题讨论】:

  • 你为什么需要这个?由于交换律,a *= b 和 a = a * b 的输出是相同的。方法#1 是我想到的最短的方法。
  • @wpichl 和 op 询问 a = b * a; 不是累积的。例如矩阵乘法 - 顺序很重要。
  • @wpichl 正如血腥所说。这是我正在处理的一个矩阵乘法的具体案例,以便为任何需要进一步上下文的人澄清它。
  • 没有直接的方法可以做到这一点。只需使用文本函数名称,例如 mul_left / mul_right

标签: c++ operators multiplication


【解决方案1】:

正如 cmets 中所指出的,标准 C++ 中没有办法。

但是在添加代理类时,可以获得所需的语法:

#include <assert.h>
#include <array>

template <class T>
class R
{
public:
  R(T& lhs)
    : _lhs(lhs)
  {}
  T& operator *=(const T& rhs)
  {
    _lhs = rhs * _lhs;
    return _lhs;
  }
  T& operator -=(const T& rhs)
  {
    _lhs = rhs - _lhs;
    return _lhs;
  }

private:
  T& _lhs;
};

int main()
{
  int a = 2, b = 5;
  R(a) -= b;
  assert(a == 3);
}

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2015-08-04
    • 2015-12-13
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多