次のようなコードを記述できるパラメータクラスを設計しました。
//define parameter
typedef basic_config_param<std::string> name;
void test(config_param param) {
if(param.has<name>()) { //by name
cout << "Your name is: " << param.get<name>() << endl;
}
unsigned long & n = param<ref<unsigned long> >(); //by type
if(param.get<value<bool> >(true)) { //return true if not found
++n;
}
}
unsigned long num = 0;
test(( name("Special :-)"), ref<unsigned long>(num) )); //easy to add a number parameter
cout << "Number is: " << num; //prints 1
クラスのパフォーマンスは非常に高速です。すべてがスタック上の単なる参照です。そして、すべての情報を保存するために、ヒープ割り当てに進む前に最大5つの引数の内部バッファーを使用して、すべてのオブジェクトのサイズを減らしますが、これは簡単に変更できます。
operator,()
名前付きパラメーターを実装するためにオーバーロードして、この構文がより頻繁に使用されないのはなぜですか?パフォーマンスが低下する可能性があるためですか?
もう1つの方法は、名前付きイディオムを使用することです。
object.name("my name").ref(num); //every object method returns a reference to itself, allow object chaining.
しかし、私にとっては、operator,()
二重括弧を使用することを忘れない限り、オーバーロードははるかに「現代的な」C++に見えます。通常の機能より遅くても性能はそれほど低下しないので、ほとんどの場合無視できます。
私はおそらくこのような解決策を思いついた最初の人ではありませんが、なぜそれがより一般的ではないのですか?上記の構文(私の例)のようなものは、それを受け入れるクラスを作成する前に見たことがありませんが、私にとっては完璧に見えます。