以下のコードではpythonのような引数を引数名で順不同に指定する方法が実現できる.思いつくまでに随分と時間がかかった.C++ はどんな言語の記述様式も再現できることを目指しているらしいが,考えるのに苦労する.
#include <iostream>
using namespace std;
struct A{
int a1;
int a2;
int id;
A(){
a1 = 0;
a2 = 0;
id = -1;
}
};
struct A1 : public A{
A1(int a){
A::id = 1;
A::a1 = a;
}
A operator=(int a){
A na = A1(a);
return na;
}
};
struct A2 : public A{
A2(int a){
A::a2 = a;
A::id = 2;
}
A operator=(int a){
A na = A2(a);
return na;
}
};
A1 Argument1 = 0; // ここの初期化は何でも良い
A2 Argument2 = 0; // ここの初期化は何でも良い
int F(A ap1 = A1(0), A ap2 = A2(0)){
int a1 = 0;
int a2 = 0;
if(ap1.id == 1){
a1 = ap1.a1;
}else if(ap2.id == 1){
a1 = ap2.a1;
}else{
a1 = ap1.a1;
}
if(ap1.id == 2){
a2 = ap1.a2;
}else if(ap2.id == 2){
a2 = ap2.a2;
}else{
a2 = ap2.a2;
}
cout << "Argument1: " << a1 << ", Argument2: " << a2 << "\n";
return 0;
}
int main(){
F(Argument1 = 2, Argument2 = 1);
F(Argument1 = 2);
F(Argument2 = 1);
F(Argument2 = 1, Argument1 = 2);
F();
return 0;
}
実行結果を以下に示す.期待通りに引数が渡されていることがわかる.
C++継承のにより実現している.ここでは簡単のためにすべてpublicメンバとしてクラスの要素を実装したが,実用上は適宜privateとするなど工夫をすることが望ましい.