- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于c++中逗号运算符重载的帖子(问题)很多。大多数答案建议不要使用逗号运算符重载。我想编写一个语法与 Matlab 语言非常相似的 C++ 库。基本对象是 Matrix MX。我希望能够让库的最终用户编写如下表达式:
MX a = b(i);// get b elements at indices i
b(i,j)= a; // set elements of b at indices i,j.
我有一个关于如何使用代理类使 setter 和 getter 像上面写的那样工作的想法,该代理类保存指向 MX 对象的指针并还保存索引 i,j 对象。例如 b(i,j) 将创建一个代理对象 ProxMX(b,i,j)。然后我们定义一个方法来将 ProxMX 分配给 MX 和 visversa(使用运算符 =)来完成获取和设置 b 的元素的艰巨工作。
我需要帮助来进行函数调用,例如:
(x,y,z)= ff(a,b,c)
其中 a、b、c 是输入参数(MX 对象),x、y、z 是输出参数。如果上述语法不可能,我可以考虑这样的语法:
ff((a,b,c), (x,y,z) )
我开始编写这段测试代码:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
class MX {// Matrix
public:
MX(double va) {
elem=va;// only one double for the moment to test the syntaxe
}
MX &operator ()(MX idx){ // get & set MX(i)
return *this;//
};
MX &operator ()(MX idx1,MX idx2) { // get set MX(i,j)
return *this;
} ;
friend ostream &operator<<(ostream &stream, MX a);
double elem;
};
ostream &operator<<(ostream &stream, MX a)
{
stream << a.elem ;
return stream;
}
typedef vector<const MX > MXR;
class ArgList { // Proxy
public:
//ArgList(const MX& a){
// data.push_back(a);
//}
ArgList() {};
ArgList& operator , (const MX &a){
data.push_back(a);
return *this;
}
ArgList& operator =(ArgList& ins){
for (int i=0 ;i <ins.data.size();i++)
(this->data[i]).elem=ins.data[i].elem;
return *this;
};
MXR data;
};
ArgList operator , (const MX& a, const MX& b){
ArgList out;
out.data.push_back(a);
out.data.push_back(b);
return out;
}
ArgList ff(ArgList argins)
{
int n = argins.data.size();
MX a= argins.data[0];
MX b= argins.data[1];
MX x(a.elem+1.0);
MX y(b.elem+10.0);
MX z(a.elem+b.elem);
return ( x, y , z);
}
void gg(ArgList argins, ArgList &argout)
{
int n = argins.data.size();
MX a= argins.data[0];
MX b= argins.data[1];
MX x(a.elem+1.0);
MX y(b.elem+10.0);
MX z(a.elem+b.elem);
argout = ( x, y , z);
}
int _tmain(int argc, _TCHAR* argv[])
{
MX a(1.0);MX b(2.0);MX c(3.0);
MX aa = a(MX(3.0));
aa(MX(2.0),MX(3.0))=MX(5.0);
cout << "a=" << a << ",b=" << b << ",c=" << c << endl;
MX x(0.0);MX y(0.0);MX z(0.0);
cout << "x=" << x << ",y=" << y << ",z=" << z << endl;
(x,y,z)= ff((a , b, c ));
cout << "x=" << x << ",y=" << y << ",z=" << z << endl;
gg((a,b,c) , (x,y,z));
cout << "x=" << x << ",y=" << y << ",z=" << z << endl;
return 0;
}
此代码使用 VS2010 Express 编译和运行时没有错误 :)。但正如预期的那样,它没有给出预期的结果,因为我需要在 ArgList 中保存对变量的引用,而不是将对象复制到 vector 中。我知道我们不能将 std::vector 用作对象引用的容器。
为了使这些表达式可写并在 C++ 代码中工作而提供的任何帮助。谢谢。
最佳答案
我正在使用 C++11 为您概述一个解决方案(代码也经过测试),但这在 C++03 中是可行的(使用例如 Boost.Tuple):
// Base case
template<typename Lhs, typename Rhs>
std::tuple<Lhs&, Rhs&>
operator,(Lhs& lhs, Rhs& rhs)
{
return std::tie(lhs, rhs);
}
// General case when we already have a tuple
template<typename... Lhs, typename Rhs>
std::tuple<Lhs..., Rhs&>
operator,(std::tuple<Lhs...>&& lhs, Rhs& rhs)
{
return std::tuple_cat(lhs, std::tie(rhs));
}
用法看起来像(假设此运算符驻留在 namespace ns
中):
// Declaration: note how ff must return a tuple
std::tuple<X, Y, Z> ff(A, B, C);
A a = /* ... */;
B b = /* ... */;
C c = /* ... */;
X x; Y y; Z z;
using ns::operator,;
// brackets on the left-hand side are required
(x, y, z) = ff(a, b, c);
附上注意事项:
如您所见,您需要一个 using 声明来引入 operator,
在适用范围。即使类型 X
, Y
, Z
位于 operator,
的同一范围内(启用 ADL),std::tuple
没有。你可以做类似template<typename... T> struct tuple: std::tuple<T...> { using std::tuple<T...>::tuple; };
的事情(然而,在 C++03 中做起来并不方便)在适当的命名空间中拥有自己的元组,以快速而肮脏的方式拥有 ADL。然而:
重载运算符必须始终至少对一种用户定义类型进行运算。所以如果输入 X
和 Y
两者都恰好是 int
之类的类型或 double
, 然后你得到默认的 operator,
.此类事情的通常解决方案是要求客户端执行类似 (ref(x), ref(y), z) = ff(a, b, c);
的操作其中 ref
将在适当的命名空间中返回一个类型(再次用于 ADL 目的)。也许这种类型可以根据 std::reference_wrapper
来实现(或用于 C++03 的 Boost 版本)具有与元组相同的快速和肮脏的 hack。 (您需要额外重载 operator,
。)
总而言之,当像这样的事情发生时,这是很多工作(有丑陋的解决方法)
/* declaration of ff and variable definitions the same as before */
std::tie(x, y, z) = ff(a, b, c);
或许
/* this skips unnecessary default constructions of x, y, z */
auto tuple = ff(a, b, c);
using std::get;
auto& x = get<0>(tuple);
auto& y = get<1>(tuple);
auto& z = get<2>(tuple);
开箱即用(即使在 C++03 中使用 Boost.Tuple)。我在这件事上的建议是(没有任何意图):保持简单,愚蠢!并使用它。
关于C++ 逗号运算符重载和引用 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10295010/
Or 运算符 对两个表达式进行逻辑“或”运算。 result = expression1 Or expression2 参数 result 任意数值变量。 expression1 任意
Not 运算符 对表达式执行逻辑非运算。 result = Not expression 参数 result 任意数值变量。 expression 任意表达式。 说明 下表显示如何
Is 运算符 比较两个对象引用变量。 result = object1 Is object2 参数 result 任意数值变量。 object1 任意对象名。 object2 任意
\ 运算符 两个数相除并返回以整数形式表示的结果。 result = number1\number2 参数 result 任意数值变量。 number1 任意数值表达式。 numbe
And 运算符 对两个表达式进行逻辑“与”运算。 result = expression1 And expression2 参数 result 任意数值变量。 expression1
运算符(+) 计算两个数之和。 result = expression1 + expression2 参数 result 任意数值变量。 expression1 任意表达式。 exp
我对此感到困惑snippet : var n1 = 5-"4"; var n2 = 5+"4"; alert(n1); alert(n2); 我知道 n1 是 1。那是因为减号运算符会将字符串“4”转
我想我会得到 12,而不是 7。 w++,那么w就是4,也就是100,而w++, w 将是 8,1000;所以 w++|z++ 将是 100|1000 = 1100 将是 12。 我怎么了? int
Xor 运算符 对两个表达式进行逻辑“异或”运算。 result = expression1 Xor expression2 参数 result 任意数值变量。 expression1
Mod 运算符 两个数值相除并返回其余数。 result = number1 Mod number2 参数 result 任意数值变量。 number1 任意数值表达式。 numbe
Imp 运算符 对两个表达式进行逻辑蕴涵运算。 result = expression1 Imp expression2 参数 result 任意数值变量。 expression1 任
Eqv 运算符 执行两个表达式的逻辑等价运算。 result = expression1 Eqv expression2 参数 result 任意数值变量。 expression1 任
我有一个运算符重载的简单数学 vector 类。我想为我的运算符(operator)获取一些计时结果。我可以通过计时以下代码轻松计时我的 +=、-=、*= 和/=: Vector sum; for(s
我是用户定义比较运算符的新手。我正在读一本书,其中提到了以下示例: struct P { int x, y; bool operator、运算符<等),我们
在 SQL 的维基百科页面上,有一些关于 SQL 中 bool 逻辑的真值表。 [1] 维基百科页面似乎来源于 SQL:2003 标准。 等号运算符 (=) 的真值表与 SQL:2003 草案中的 I
我遇到了一个奇怪的 C++ 运算符。 http://www.terralib.org/html/v410/classoracle_1_1occi_1_1_number.html#a0f2780081f
我正在阅读关于 SO 和 answers 中的一个问题,它被提到为: If no unambiguous matching deallocation function can be found, pr
我偶然发现了这个解决方案,但我无法理解其中到底发生了什么。谁能解释一下! 据我了解,它试图通过计算一半的单元格然后将其加倍来计算 a*b 网格中的单元格数量。但是我无法理解递归调用。 请不要建议其他解
Go的基本类型 布尔类型bool 长度:1字节 取值:布尔类型的取值只能是true或者false,不能用数字来表示 整型 通用整型 int / uint(有符号 / 无符号,下面也类似) 长度:根据运
在本教程中,您将学习JavaScript中可用的不同运算符,以及在示例的帮助下如何使用它们。 什么是运算符? 在JavaScript中,运算符是一种特殊符号,用于对运算数(值和变量)执行操作。例如,
我是一名优秀的程序员,十分优秀!