C++で延々とRAIIラッパーを書く話
C++でMetalを触る時にはDeviceとかBufferとかContextとかのRAIIラッパーを書く事になる。これは登場人物全部が揃ってないとHello World的なものも書けないという点でなかなかモチベーションの上がらない、かったるい作業だ。 そして最近はDirectComputeをC++から触る事になり、同じような事をしている。またかよ…
こういう、下がC++でない機能に対してC++のラッパーを書くのは、ちょくちょくある作業に思う。 ほとんど全くみんな同じような事をやっていて、 こんなの別に誰か一人がやれば、他の人はそれ使えばいいんじゃないか、 という気はするし、間違いなく同じような事をやったコードはいくらでもあるのだが、 結局は自分でやる方が早い。 投げる例外を何にするか、 何はラップして何は下のAPIそのまま呼ばせるか、 そうした細かい選択で微妙に人それぞれな部分があり、 その違いは結構使いやすさにも影響を与える。 ほとんど同じとは言えちょっとは違いもあって、 DeviceとContextは分けるのか一緒に持たせるのか、とか、どのフラグは外にも出すかとか、ちょくちょく問題に合わせて違う所もある。
そして自分で自分が使う所だけを書くと、この手のコードは結構短い。このくらいなら自分で書く方が面倒も無いよな、と思うくらいには短い。 一方でラップしたものを他人も使えるようにと考えると全部ラップされるのでコードが結構な量になる。 ちょこちょこいじりたい時にそうしたコードは割と邪魔なので、 結局自分で自分に必要な程度ラップするのが一番良い、という事になる。
そういう訳で今日も世界中のC++プログラマが、皆も同じようなコード書いているんだろうな、というRAIIのラッパーを書いていたりする。 無駄な事のような気もするけれど、大した作業でも無いので自分で書くのが一番なのである。
でもこういうのってC++くらいだよなぁ。 Pythonでもなんでも、他の言語ではその言語用のライブラリを使うのはほぼ必然で、 それが気に食わなくて自分で作る時でも、それはごく一部の人がやる事であって、みんなが別々に同じようなラッパーを書く、という事は無いと思う。 DirectXでもMetalでも、下がC++じゃないがC++から簡単に呼べる、というあたりがこのかったるいラップ作業をみんながやる理由になっていて、 そんな言語はC++とObjective-Cくらいしか無い。 例えばC#のP/Invokeもかなり楽ではあるしたまにWin32APIのラップを各自がやるような事もあるけれど、 C++よりはライブラリを使う事は多いと思う。
ほとんどみんな同じ作業をしているのだが、微妙にちょっとだけ違うせいで結局自分で書く方がいいの、 なんかC++って感じだよなぁ。 しかも自分で書くとやっぱいい感じになるんだよね。 自分の問題に合わせて書くから自分で書くのが一番いいのは当たり前なんだけれど。 それでも「こんなの絶対100万人くらい同じ事やってる!」という気分にはなってしまい、 こんなブログ記事を書きたくもなるのだった。