メモリバリアの理解が甘い


 やっぱ根本的にメモリバリアの理解が甘いなあと思った。今のところ、状況的にメモリバリアの明示が不要だからなあ。バグってても出ないんだよな。
 とりあえず、明らかにバグってるくさい過去エントリのコードを適当に直したけど、曖昧なまま何となく書いてるからどうにも。
 つーか、たまたま環境とコンパイラの仕様的に不要、書いても書かなくても同じバイナリ、ってコードかもしれないから、バッサリ行っていいのか分からん。


3Dのムービーがヌラリヌラリして見える


 嫌いなんすよ。大抵の3DなCGのムービーのモーションが。
 つーか昔は3DのCGが大抵嫌いで、グーローシェーディングなんかもう激しく嫌いだったけど、最近はもう慣れた。あまつさえ3Dエロゲーとか買ったりもした(笑)。
 何つーかなー。ヌラーリと動くのが気持ち悪い。髪の毛とかもヌラヌラ揺れる。サラサラじゃなくてヌラヌラと。何なんだろう。
 ちなみに、適当なしょぼいシェーディングだろうがレイトレだろうが個人的には大して変わらない。んなもんはぶっちゃけマニアックなディテールに過ぎない。理由の一部は単純に、絵じゃなくて図に見えるっつー面もあるんだろうけど。それだけじゃないけど。自分でも何だか分からんけど。

 最近ほとんどテレビを見ないけど、全く見ない訳ではなくて、たまたま目に入った映画のトレーラーか何かがまたヌラーリ。この時代になってもまだヌラヌラしてんのかと。
 モーションキャプチャとかしたゲームは大丈夫だったりするんだけどなあ。あとリアル系のCGはかなり平気だな。デフォルメ掛かった奴の大半がヌラヌラしてる。何とかならんですかね。

 とか、前々から、つーか3DのCGを初めて見た頃からずっと持ってきた違和感で、あ〜ごんとかにも何度か愚痴ってた話ではあるんだけど、今更書こうと思ったきっかけは、富野が「CG嫌い」とか言ってる講演の記事があったから(笑)。
 まあ、同じ感覚なのかは知らんけど、3DのCGについて言ってるんだったら、非常に同感なところの多い話であった。2DのCGなら全然同感じゃないけど(笑)。エロゲーとかまさに絵描きの世界だしなあ。エロ万歳。
 最近の3Dは、動かなければ割と好きというか、図じゃなくなってる感じはする。そうじゃなきゃエロゲーとか買わない(笑)。まあ、動くと途端にアレなんで結局アレでしたが。

 で、せめてモーションのヌラヌラ感は何とかして欲しいのだ。個人的に一番きついとこなんで。デコジャンプに近い違和感が。もしかすると、補間関数か何かでモーションが作られてるのかなあ。補間関数も結局は絵じゃなくて図だよな。もちろん、図が気持ちいい場合ってのもかなりあるけど。定規で引いた線が綺麗なこともある訳だし。窓枠なんかは図的な美しさも普通は欲しいし。でもモーションはなあ。何とかならないかなあ。つーか物理なんか本来は図的な美しさなはずだしなあ。やっぱ理屈だと自分でもよく分からんな。


超短いコード


#include "/dev/tty"
というのがIOCCCにあったらしい。
 DOS的には、
#include "con"
こうですか。楽そうッスね。IDEだと駄目そうだけど。

 つーかVC++2008EEで試してみた。普通にエラー。ちっ(笑)。


is_sameとかあったし


 こーゆーの欲しいんだけどなーと思ってて見付からなかった奴が普通にあった。
 結局、こんなコードで良かった。

template <typename T>
void set ( typename enable_if< is_same< uint32_t, T >, const T& >::type t ) {
  as_uint32 = t;
}

 まあ、色々練習になったから良し。

 あと、unionで型変換を潰すようなのはtype erasureとか言って、boost::anyなんかでも使われてるっぽい。やっぱこれしか無いのか。だりー。Modern C++ Designとか読めば書いてあるのかなあ。まあ、ネットに転がってる情報の拾い読みと試行錯誤で何とかなるかな。だりー。
 関数ポインタとデータポインタの書き分けとかは結局自前だったし。書き分ける意味多分ねーけど。
 つーか、ついこないだまで「SFINAE怖いからやめとこう」とか言ってたの誰(笑)。


何故いつも寄り道を始めるのか


 何か疲れたんで、今日もメタプログラミングがしたい気分になり、つらつらと見ていたら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++はどんなに便利になることだろう。これだけ広範にクリティカルに使われてる言語だと相当動きにくいんだろうけど。