VC10のmake_shared読んだら気分が悪くなった件
えそらんカレンダーに使ってもよかったんだけど単発で。
unique_ptrにもmake_sharedみたいなのがほしいなーと思いました。
id:iorate:20101231:1293806776に、「Variadic Templatesがあれば簡単だよ!」と書かれていました。が、VC10ではまだ使えないようです。ぐぬぬ。
じゃあmake_shared読んでみればいいじゃん。
// TEMPLATE FUNCTION make_shared template<class _Ty _C_CLASS_ARG0> inline shared_ptr<_Ty> make_shared(_ARG0_A0_REFREF) { //略 }
もしやこの_C_CLASS_ARG0ってVariadicTemplates相当の独自拡張キーワードが使われているのでは!わくわく!
#define _CLASS_ARG0 _LIST(class _Arg) #define _C_CLASS_ARG0 _COMMA0 _CLASS_ARG0
おお、それらしくなってきたぞ。あと一息だな!
#define _CDR(x) _CORE(x) _LCOMMA _LAST(x) #define _LIST(x) _FIRST(x) _MCOMMA _CDR(x)
・・・あれ?3つもテンプレート引数使うの??
#if _NARGS == 0 #define _CORE(x) _CORE_0(x) #elif _NARGS == 1 #define _CORE(x) _CORE_1(x) #elif _NARGS == 2 #define _CORE(x) _CORE_2(x) #elif _NARGS == 3 #define _CORE(x) _CORE_3(x) #elif _NARGS == 4 #define _CORE(x) _CORE_4(x) ...
(;・∀・)
#define _CORE_0(x) #define _CORE_1(x) #define _CORE_2(x) #define _CORE_3(x) _YNAME(x, 1) #define _CORE_4(x) _CORE_3(x), _YNAME(x, 2)
(;;・∀・)
嫌な予感がして参りました。
でもその予感が正しいならば_ARGSはどこで定義してるんだろう、というか_NARGSをある値に固定したら引数の数固定になってしまうわけで、まだ疑問符が消えません。
さらに謎めいているのがヘッダー頭のコメント。
// xfwrap1 internal header // NOTE: no include guards // sets up macro arguments for use in the header named by _INCL_FILE
なぜかインクルードガードが使われていない。理由があるのだろうか。
で、grepかけたら
#define _NARGS 1 #include <xfwrap1> #undef _NARGS #define _NARGS 2 #include <xfwrap1> #undef _NARGS #define _NARGS 3 #include <xfwrap1> #undef _NARGS #define _NARGS 4 #include <xfwrap1> #undef _NARGS ...
……見てはいけないものを見てしまった気がする。
謎の技術は確かに使われていたけど、コピペを防いでいるだけだったわ・・・