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.
MXオブジェクトへのポインターを保存し、インデックスi、jオブジェクトも保存するプロキシクラスを使用して、セッターとゲッターを上記のように機能させる方法について考えています。たとえば、b(i,j) は Proxy オブジェクト ProxMX(b,i,j) を作成します。次に、ProxMX を MX およびその逆 (演算子 = を使用) に割り当てるメソッドを定義します。これは、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 に保存する必要があるため、期待どおりの結果が得られません。オブジェクトへの参照のコンテナーとして std::vector を使用できないことはわかっています。
これらの式を書き込み可能にし、C++ コードで作業するためのヘルプ。ありがとう。