この巨大なツリーは、基本的にキーとメタデータの種類に応じて共通のオブジェクト上で文字列キーと異なる関数呼び出しを持つ大きなスイッチ/ケースです。プリプロセッサを使ったメタプログラミングC/C++
すべてのエントリは、基本的にdo_something
が異なる呼び出しを持つことができるので、私は関数ポインタを使用することはできません。この
} else if (strcmp(key, "key_string") == 0) {
((class_name*)object)->do_something();
} else if (...
のように見えます。また、一部のキーでは、オブジェクトをサブクラスにキャストする必要があります。
これを高水準言語でコーディングすると、ラムダ辞書を使用してこれを簡略化します。
私が
case_call
は、最初のコードスニペットにこのコードを拡大するマクロだろう
case_call("key_string", class_name, do_something());
case_call(/* ... */)
のようなものにこれを簡素化するためにマクロを使用することができることを私に起こりました。
しかし、それは良いスタイルと見なされるかどうか私はフェンスに非常にです。つまり、タイピング作業を減らしてコードのDRY性を向上させることができますが、実際にマクロシステムを多少乱用しているようです。
あなたはその道を歩いて行くのか、それとも全体を打ち込むのですか?そうすることについてのあなたの推論は何でしょうか?
編集
いくつかの明確化:
このコードは、C++ APIのような単純なキーと値の特性のいくつかの異なる側面をアクセスする簡略化されたスクリプティングAPIの間に接着層として使用されます。プロパティはC++ではさまざまな方法で実装されていますが、一部にはゲッター/セッターメソッドがあり、一部は特殊な構造体に設定されています。スクリプトアクションは、共通の基本クラスにキャストされたC++オブジェクトを参照します。ただし、一部のアクションは特定のサブクラスでのみ使用可能であり、キャストダウンする必要があります。
私は実際のC++ APIを変更する可能性がありますが、現時点では変更できないとみなされる必要があります。また、これは組み込みコンパイラで動作する必要があるため、boostやC++ 11は(悲しいことに)利用できません。
投票を閉じる理由 - これは非常に有効で有効な質問です。私はここで何が欠けていますか? –
「この質問は私たちのQ&A形式には適していませんが、一般的には事実、参考文献、または特定の専門知識を含む回答が期待されます」*この質問は意見、討論、議論、投票、ディスカッション。* " – Fanael
すでに+5点ですので、自分自身も含めて他の人が結果に興味を持っていると言います。以下の答えは、すでにかなり良いです。 –