是否可以在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)
(当然这是无稽之谈.)
我正在读一本关于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部分.但为什么?
我没有在任何生产环境中使用此代码,这只是为了我的理解.这段代码是否有效(即我可以像这样定义我的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
第二次通话
所以我想写一个自动的!=:
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) 考虑一个简单的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) 我有以下代码:
#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++中你可以以一种奇怪的方式重载"函数调用"操作符,你需要编写两对括号来执行此操作:
class A {
int n;
public:
void operator ()() const;
};
Run Code Online (Sandbox Code Playgroud)
然后以这种方式使用它:
A a;
a();
Run Code Online (Sandbox Code Playgroud)
什么时候有用?
考虑编写可索引类的任务,该类自动将其状态与某些外部数据存储(例如文件)同步.为了做到这一点,需要让类知道可能发生的索引值的更改.不幸的是,重载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 [],这可能更有意义?
我知道有很多这样的问题,但我找不到适合我的解决方案.
我试图制作简单的分数计算器,而不是可以添加或减去任意数量的函数,并将答案写为减少的分数.
示例: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) 我想覆盖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 '_'