こんにちは、高木です。
今回でTcl_Obj型についてはいったん終わりにしようと思います。Tcl_Obj型が導入されたのはバイナリーデータを扱うためと書いたのに、一番最後になってしまいました。
実際には、ほかにもリストやディクショナリーといった型が使えるのですが、ちょっとややこしくなるので、必要になるまで後回しにしようと思います。
あと、これまで忘れていたのですが、Tcl_Obj*からobjクラスを構築するためのコンストラクターが必要ですね。これも今回あわせて作ることにします。
それではコードを見ていきましょう。
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |     obj(Tcl_Obj* ptr) : obj_(ptr)     {       Tcl_IncrRefCount(this->obj_);     }     obj(const std::byte* data, std::size_t n)       : obj_(Tcl_NewByteArrayObj(reinterpret_cast<const unsigned char*>(data), static_cast<int>(n)))     {       Tcl_IncrRefCount(this->obj_);     }     obj(std::span<const std::byte> data) : obj(data.data(), data.size())     {     }     std::span<const std::byte> get_byte_array() const     {       int n;       if (auto r = reinterpret_cast<const std::byte*>(Tcl_GetByteArrayFromObj(this->obj_, &n)))       {         return { r, r + n };       }       return {};     } | 
今回追加するコンストラクターは3つです。最初は先ほどお話ししたTcl_Obj*からの変換コンストラクターです。次の2つがバイナリーデータを扱うためのコンストラクターです。2番目はstd::byte型の配列から、3番目はstd::byte型のspanからobjクラスのオブジェクトを構築します。
あとは、objクラスのオブジェクトからバイナリーデータを取り出すget_byte_arrayメンバー関数です。
前述したように、Tcl_Obj型はほかにもリストやディクショナリーを扱うこともできます。これについては、必要になった時点であらためてお話しすることにします。
次回はTcl_Interp型のラッパークラスについて考えていきたいと思います。



![[迷信] コンストラクタで自身をゼロクリア](https://www.kijineko.co.jp/wp-content/uploads/2021/06/4450701_s.jpg)

![[C11] 第6回 プログラムの開始と終了](https://www.kijineko.co.jp/wp-content/uploads/2021/10/2486607_s.jpg)
