int
を返すC API関数をラップしようとしていて、条件をチェックして診断を提供し、エラーが発生した場合に例外をスローするマクロには、マクロ呼び出しにポインタを返すC API関数をラップします
#define CALL_INT(name, ...) do { \
if(!name(__VA_ARGS__)) throw std::runtime_error(#name " failed");
} while(0)
// using it
CALL_INT(foo, arg);
が、私はnullptr
に対してそのポインタをチェックして、私のポインタに代入する必要があるとして、ポインタを返す関数のは、それほど単純ではありません。私はそれint
を必要としないようint
を返す関数の場合、それは簡単です。だから、同様のマクロを記述することが可能であるので、この式は動作します:
auto ptr = CALL_PTR(foobar, arg1, arg2);
それはnullptr
に対してfoobar(arg1, arg2)
チェック結果を呼び出すコードを生成し、エラーが起こっていない場合は割り当てのために、それが利用可能になるだろう。すなわち。
なぜテンプレートラッパーを作成する代わりに、この方法で作業していますか? – krzaq
@krzaqテンプレートラッパーは関数名を文字列化できません – Slava
マクロのみを使用してテンプレート名付きラッパーに関数名を渡すソリューションは満足いくものでしょうか? – krzaq