何か疲れたんで、今日もメタプログラミングがしたい気分になり、つらつらと見ていたらis_power_of_2が目に付いた。ああ、これコンパイルタイムに解決してみたいッスね。しようしよう。
してみた。元々assertの中でしか使ってない関数だったので、普通の関数の方が簡単便利で良かった。何てこった。
カッとなって、2の累乗で特殊化される関数とか書いて気を鎮めた。多分バイナリ全然変わらないが。
まあしかし、メタ関数の書き方や使い方にも少しだけ慣れてはきた。
関数(普通の)の引数に
typename enable_if<Cond>::type* = 0
とか書く意味もやっと理解した。要するに
typename enable_if<Cond>::type *dummy = 0
と書けば少し分かりやすいんだよな。Condが偽だとtypeが存在しないからSFINAEで実体化されない、ってのを利用する訳だけど、引数dummyを実際には書かなくていいようにしたいから初期値を書きたい訳で、ポインタ型にすればtypeがどんな型でも0は代入できるね、と。
で、dummyは使ってない引数だから名前を消すと、最初の書き方に戻る訳か、なるほど、と。
変態イディオムに支配された世界に革命は起きないんでしょうか(笑)。まあ変態イディオム好きだけどさ。新しい便利技術とかの根幹がことごとく変態に支配されてるのはやばいよなあ、言語的に。
同じ機能がすっきり書けるなら、C++はどんなに便利になることだろう。これだけ広範にクリティカルに使われてる言語だと相当動きにくいんだろうけど。
(Visited 3 times, 1 visits today)