C++에서 쉼표 연산자 오버로드에 대한 많은 게시물 (질문)이 있습니다. 대부분의 답변 조언은 쉼표 연산자 오버로드를 사용하지 마십시오. Matlab 언어와 매우 유사한 구문으로 C++ 라이브러리를 작성하고 싶습니다. 기본 개체는 Matrix MX입니다.C++ 쉼표 연산자 오버로드 및 참조 벡터
MX a = b(i);// get b elements at indices i
b(i,j)= a; // set elements of b at indices i,j.
내가 저장 프록시 클래스를 사용하여 위의 기록으로 세터 &에게 게터 작업을 수행하는 방법에 대한 아이디어가 : 내가 좋아하는 표현을 쓸 수있는 라이브러리의 최종 사용자를 만들 수 있도록하려면 MX 객체에 대한 포인터이며 인덱스 i, j 객체도 저장합니다. 예를 들어, b (i, j)는 프록시 객체 ProxMX (b, i, j)를 생성합니다. 그런 다음 우리는 ProxMX를 MX에 할당하고 visversa (operator =를 사용)를 지정하여 &에 b 요소를 설정하는 작업을 정의합니다. A, B, C는 입력 argments (MX 오브젝트) 및 X, Y, Z이다
(x,y,z)= ff(a,b,c)
출력 argments 같습니다
내가 작동하도록 도움을 필요로하는 것처럼 호출한다. 나는이 테스트 코드를 작성하기 시작ff((a,b,c), (x,y,z))
: 위의 syntaxe이 가능하지 않은 경우 는 내가 같은 syntaxe에 대해 생각할 수 : VS2010 Express를 사용하여 오류없이
#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;
}
이 코드는 & 실행을 컴파일 . 그러나 예상대로 벡터의 객체 복사본을 만드는 대신 ArgList에 변수에 대한 참조를 저장해야하기 때문에 예상 한 결과를 얻지 못합니다. 나는 우리가 std :: vector를 객체에 대한 참조의 컨테이너로 사용할 수 없다는 것을 안다.
논문을 쓰기 가능하게 만들고 C++ 코드로 작업하려면 도움이 필요합니다. 감사합니다. .
실제 문제는 무엇인지 자세히 설명해 주실 수 있습니까? 예상대로 행동하지 않습니까? 'std :: vector'가 아닌 다른 컨테이너가 필요합니까? 다른 것? –
(x, y, z) = ff ((a, b, c))와 같은 표현식을 사용하여 C++에서 함수를 호출하는 데 도움이 필요합니다. 첫 번째 테스트 코드는 객체에 대한 참조를 받아들이는 컨테이너가 올바른 방향이라고 생각하게한다. 하지만 난 쉬지 않아. – Yazou
[Armadillo] (http://arma.sourceforge.net/) 및 [Blitz ++] (http : //)와 같은 MATLAB과 유사한 구문을 제공하는 것을 목표로하는 C++ 용의 기존 오픈 소스 선형 대수 라이브러리가 많이 있습니다. www.oonumerics.org/blitz/). 당신은 그들의 근원을 볼 수 있습니다. – James