标签: operator-overloading

我可以在Javascript中定义自定义运算符重载吗?

是否可以在JavaScript中的类型实例之间定义自定义运算符?

例如,假设我有自定义矢量类,是否可以使用

vect1 == vect2
Run Code Online (Sandbox Code Playgroud)

检查是否相等,而底层代码是这样的?

operator ==(a, b) {
    return a.x == b.x && a.y == b.y && a.z == b.z;
}
Run Code Online (Sandbox Code Playgroud)

(当然这是无稽之谈.)

javascript dsl equality vector operator-overloading

26
推荐指数
4
解决办法
1万
查看次数

C++为什么赋值运算符应该返回一个const ref以避免(a = b)= c

我正在读一本关于C++的书,更确切地说是关于运算符重载的书.

示例如下:

const Array &Array::operator=(const Array &right)
{
// check self-assignment
// if not self- assignment do the copying
return *this; //enables x=y=z
}
Run Code Online (Sandbox Code Playgroud)

本书提供的关于返回const ref而不是ref的解释是为了避免诸如(x = y)= z之类的赋值.我不明白为什么要避免这种情况.我知道在这个例子中首先计算x = y,因为它返回一个const引用,所以不能执行= z部分.但为什么?

c++ operator-overloading assignment-operator

26
推荐指数
3
解决办法
1万
查看次数

是否允许在后缀运算符++中命名参数?

我没有在任何生产环境中使用此代码,这只是为了我的理解.这段代码是否有效(即我可以像这样定义我的postfix运算符吗?):

class A
{
public:
    A& operator++(int n)
    {
        std::cout<<"N is:"<<n<<"\n";
        return *this;
    }
};


int main()
{   
    A a;
    a++;
    a.operator ++(10);
}
Run Code Online (Sandbox Code Playgroud)

在VS2008上,我得到输出为:

N是0

第一次通话和

N是10

第二次通话

c++ operator-overloading

26
推荐指数
3
解决办法
417
查看次数

在SFINAE模板中如何避免这句话是假的?

所以我想写一个自动的!=:

template<typename U, typename T>
bool operator!=(U&& u, T&& t) {
  return !( std::forward<U>(u) == std::forward<T>(t) );
}
Run Code Online (Sandbox Code Playgroud)

但这是不礼貌的1.所以我写

// T() == U() is valid?
template<typename T, typename U, typename=void>
struct can_equal:std::false_type {};

template<typename T, typename U>
struct can_equal<
   T,
   U,
   typename std::enable_if<
      std::is_convertible<
         decltype( std::declval<T>() == std::declval<U>() ),
         bool
      >::value
   >::type
>: std::true_type {};
Run Code Online (Sandbox Code Playgroud)

这是一个类型traits类,它表示"是t == u返回可转换为的类型的有效代码bool".

所以我改进了!=:

template<typename U, typename T,
  typename=typename std::enable_if<can_equal<T,U>::value>::type
>
bool operator!=(U&& u, T&& …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading sfinae c++11

26
推荐指数
1
解决办法
882
查看次数

做constexpr运算符重载的指南?

考虑一个简单的INT Wrapper与重载乘法类operator*=operator*.对于"旧式"运算符重载,可以定义operator*,operator*=甚至还有像Boost.Operators这样的库以及@DanielFrey的现代化版本操作,它们可以为您减少样板.

但是,对于使用新C++ 11的编译时计算constexpr,这种便利性消失了.A constexpr operator*无法调用,operator*=因为后者修改了它的(隐式)左参数.此外,constexpr没有过载,因此constexpr operator*在现有operator*结果中添加额外的过载分辨率模糊.

我目前的做法是:

#include <iostream>

struct Wrap
{
    int value;    

    Wrap& operator*=(Wrap const& rhs) 
    { value *= rhs.value; return *this; }

    // need to comment this function because of overloading ambiguity with the constexpr version
    // friend Wrap operator*(Wrap const& lhs, Wrap const& rhs)
    // { return Wrap { …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading constexpr c++11 c++14

26
推荐指数
1
解决办法
6480
查看次数

模糊的C++运算符重载

我有以下代码:

#include <iostream>

using namespace std;

ostream& f(ostream& os) {
    return os << "hi";
}

int main() {
    cout << "hello " << f << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

不知何故,这是有效的 - 输出是"你好".这是如何被编译器解释的?我不明白如何将函数插入到流中.

c++ operator-overloading

26
推荐指数
2
解决办法
1099
查看次数

如何重载"函数调用"操作符有用吗?

我最近发现在C++中你可以以一种奇怪的方式重载"函数调用"操作符,你需要编写两对括号来执行此操作:

class A { 
  int n;
public: 
  void operator ()() const; 
};
Run Code Online (Sandbox Code Playgroud)

然后以这种方式使用它:

A a;
a();
Run Code Online (Sandbox Code Playgroud)

什么时候有用?

c++ operator-overloading functor function-object

25
推荐指数
3
解决办法
2万
查看次数

以允许响应更新的方式重载C++索引下标operator []

考虑编写可索引类的任务,该类自动将其状态与某些外部数据存储(例如文件)同步.为了做到这一点,需要让类知道可能发生的索引值的更改.不幸的是,重载operator []的常用方法不允许这样做,例如......

Type& operator[](int index)
{
    assert(index >=0 && index < size);
    return state[index];
}
Run Code Online (Sandbox Code Playgroud)

我有什么方法可以区分被访问的值和被修改的值?

Type a = myIndexable[2]; //Access
myIndexable[3] = a;  //Modification
Run Code Online (Sandbox Code Playgroud)

这两种情况都在函数返回后发生.有没有其他方法来重载operator [],这可能更有意义?

c++ indexing operator-overloading

25
推荐指数
3
解决办法
4万
查看次数

错误:重载'operator <<'必须是二元运算符(有3个参数)

我知道有很多这样的问题,但我找不到适合我的解决方案.

我试图制作简单的分数计算器,而不是可以添加或减去任意数量的函数,并将答案写为减少的分数.

示例:input = 3/2 + 4/8,output = 2

我正在尝试重载运算符以实现此目的.

所以在程序中,我正在尝试开发输入,其中包含由运算符'+'或' - '分隔的分数表达式.

表达式中的分数数是任意的.

以下6行中的每一行都是有效输入表达式的示例:

1/2 + 3/4
1/2 -5/7+3/5
355/113
3    /9-21/    -7
4/7-5/-8
-2/-3+7/5
Run Code Online (Sandbox Code Playgroud)

*我遇到的问题是,当我运行程序时,它有一个过载操作错误:错误:重载'operator <<'必须是二元运算符(有3个参数)*

  /Users/Spicycurryman/Desktop/ECS40/hw1/fraction.cpp:61:22: error: overloaded 'operator<<' must be a binary operator (has 3 parameters)
  ostream& Fraction::operator<<(ostream &os, Fraction& n)
                     ^
/Users/Spicycurryman/Desktop/ECS40/hw1/fraction.cpp:80:22: error: overloaded 'operator>>' must be a binary operator (has 3 parameters)
  istream& Fraction::operator>>(istream &os, Fraction& n)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这是一个错误.

我的以下代码如下:

CPP文件

#include "Fraction.h"

Fraction::Fraction(int a, int b)
{

}
int Fraction::find_gcd (int n1, int …
Run Code Online (Sandbox Code Playgroud)

c++ overloading operator-overloading

25
推荐指数
1
解决办法
4万
查看次数

如何在swift中重载赋值运算符

我想覆盖CGFloat的'='运算符,如下面的尝试:

func = (inout left: CGFloat, right: Float) {
    left=CGFloat(right)
}
Run Code Online (Sandbox Code Playgroud)

所以我可以做以下事情:

var A:CGFloat=1
var B:Float=2
A=B
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?我收到了错误Explicitly discard the result of the closure by assigning to '_'

operator-overloading ios swift

25
推荐指数
2
解决办法
8089
查看次数