これ (または同様のもの) は、便利に思えることがあります。
#define ITEM_GET(variable,map) variable=map[#variable]
//...
double foo;
std::map<std::string,double> variables;
ITEM_GET(foo,variables);
ある種のテンプレートを使用して、マクロなしでこれを行うことはできますか? これは省略形の悪い習慣ですか?
必ずしもそれが悪い習慣だとは言いませんが、長所が短所を上回ることを確認する必要があります。このマクロのスコープを最小限にとどめておくことをお勧めします。たとえば、これらの操作をロード中にのみ行う場合は、マクロの存在をロード関連の関数内に制限します。
あなたのタスクがこの操作が非常に一般的であるようなものである場合、マクロを提供することは賢明なオプションのように思えます. 時折の便宜のためだけなら、マクロの一般的な誤動作 (主にスコープなし) は価値がないと思います。
最初の質問に関しては、マクロなしでこれを行う方法はありません。プリプロセッサ以降の翻訳段階では、stringise operator と同等のツールにアクセスできません#
。