つまり、この巨大なツリーは基本的に大きなスイッチ/ケースであり、文字列キーと、キーと1つのメタデータに応じて1つの共通オブジェクトに対するさまざまな関数呼び出しがあります。
すべてのエントリは基本的に次のようになります
} else if ( strcmp(key, "key_string") == 0) {
((class_name*)object)->do_something();
} else if ( ...
ここでdo_something
はさまざまな呼び出しを行うことができるため、関数ポインターだけを使用することはできません。また、一部のキーでは、オブジェクトをサブクラスにキャストする必要があります。
さて、これを高級言語でコーディングする場合は、ラムダの辞書を使用してこれを単純化します。
マクロを使用して、これを次のようなものに単純化できることに気づきました。
case_call("key_string", class_name, do_something());
case_call( /* ... */ )
case_call
このコードを最初のコードスニペットに展開するマクロはどこにありますか。
しかし、それが良いスタイルと見なされるかどうかについては、私は非常に危機に瀕しています。つまり、タイピング作業が減り、コードのDRYnessが向上しますが、実際にはマクロシステムを多少乱用しているように見えます。
あなたはその道を進みますか、それとも全部をタイプしますか?そして、そうする理由は何ですか?
編集
いくつかの説明:
このコードは、単純なKey-ValueプロパティとしてC++APIのいくつかの異なる側面にアクセスする単純化されたスクリプトAPI間の接着層として使用されます。ただし、プロパティはC++ではさまざまな方法で実装されます。getter/setterメソッドを持つものもあれば、特別な構造体で設定されるものもあります。スクリプトアクションは、共通の基本クラスにキャストされたC++オブジェクトを参照します。ただし、一部のアクションは特定のサブクラスでのみ使用可能であり、キャストダウンする必要があります。
将来的には、実際のC ++ APIを変更する可能性がありますが、現時点では変更できないと見なす必要があります。また、これは組み込みコンパイラで機能する必要があるため、boostまたはC ++ 11は(残念ながら)利用できません。