Public Notes

  • unique_ptr

    Squirrelで最近、遊んでるんですけど、HSQUIRRELVMをunique_ptrで管理できないかと思いたち、実際にできたので、メモしときます。
    コードは↓な感じです。想像以上に長くなりました、はい。STACK_SIZEは1024とか4096とか適当な定数です。深い意味はありません。
    "std::unique_ptr::type, std::function> vm(sq_open(STACK_SIZE), sq_close);"
    まず、unique_ptrでの肝はstd::functionです。最初は、関数ポインタ(sq_closeの)をそのまま渡したんですけど、コンパイルできなくて、ググったところどうも関数ポインタは受け付けないそうで。なので、std::functionに出てきてもらって、見事解決!です。std::functionはよく見かけていたので、特に使い方に迷いませんでした。
    次に、「typedefは時々お節介ですね」というお話です。別に、ヘッダをgrepして定義を見てもいいんですが(最初は実際に観ました。struct SQVMみたいな名前だった気がするんですが、struct付けるの怠いです。C++なので別にいいんですけど)、それはそれで仕様が変わった時に困るので、type_traitsを使ってポインタのtypedefから型だけゲットしました。"::type"を忘れたなんてしょーほてきなミスはしなかったわけでもしたわけでもしたかもしれないかもしれませんが、それはさておき、やっとtype_traitsさんの使い方がわかりました。ありがたやー。
    で、まあ、これで終わればよかったんですが、HSQUIRRELVM以外に、HSQOBJECTというオブジェ(クト)があります。そして、どうせならこれも、C++(標準のスマートポインタ)で管理したいと思って少しだけ妄想してました。結論は、HSQOBJECTはポインタじゃないのでデリータに載せるとかそうゆう方法を使わないと無理という判断で、やめにしています。時前で構造体を書くのはめんどくさいです。ヘッダにしたとしてもutilityなんて敗北宣言にも等しいところに置かれるのが関の山な気がします。
Copyright © Textt / GreenSpace