[象の卵] 構造体のメンバ数の取得方法?
Cの構造体のメンバ数を取得したいという要望があるようです。Cの構造体は、あくまでもコンパイル時だけの概念であり、実行時には情報が失われてしまいます。ですので、実行時にメンバ数やメンバの型、あるいはメンバ名を取得することはできません。どうしてもやりたければ、構造体とは別に自分で情報を管理するしかありません。ここまではnoocyteさんも指摘されています。
象の卵を探して...
久々にnoocyteさんのサイトにヒントを得た記事を書くことにします。今回の元ネタは象の卵です。ずいぶん前のコンテンツですが、まあ、気にせずにいきましょう。
意外に使いにくい C++ の新ライブラリ
最近では、TR1 や C++0x(C++1x といったほうが正確か?)にある程度対応した処理系も増えてきました。ところが、対応状況が中途半端な上に、処理系ごとにいろいろとローカルルールがあるので御しにくいのも事実です。移植性のことを考えなければ問題ないのかもしれませんが、移植性を気にしだすと、Visual C++ と GCC に限っても、結構めんどうです。
対象とするのを、Visual C++ 2008(2010 はまだベータなので考慮しません)と GCC 3.4 以上(Cygwin とか考慮すると、どうしてもそうなります)に絞ったとします。その場合でも、インクルードすべきヘッダの違い、名前空間の違いがあり、それらを自動判別してやらなければなりません。
Visual C++ の場合、一部しか対応していないとはいえ、基本的に TR1 の仕様通りの使い方ができます。すなわち、tuple を使いたいのであれば、<tuple> をインクルードし、std::tr1 名前空間にあるものとして扱えばよいことになります。
Visual C++用の <inttypes.h> も作ってみました。
以前、Visual C++用のを公開しましたが、意外にも利用してくださる方が多かったため、今回、<inttypes.h>も公開することにしました。C++用にも用意しています。ただし、まだテストが不十分ですので、参考程度とお考えください。
4.2 mem_fn
std::tr1::mem_fn は、メンバ関数を普通の関数のように呼び出すことができるようにする関数オブジェクトを返します。標準ライブラリにもよく似た std::mem_fun および std::mem_fun_ref というのがありますが、std::tr1::mem_fn はそれらを一般化したものであり、メンバ関数の呼び出し対象となるオブジェクトが、ポインタとして渡されるか参照として渡されるかによって、使い分ける必要がありません。
4.1 result_of
std::tr1::result_of は、関数オブジェクトが返す値の型を調べるために使うことができます。
4. 関数オブジェクト
「関数オブジェクト」というのは、簡単にいえば operator() を定義したクラスのオブジェクトです。operator() が定義されているため、関数呼出し演算子を使って、あたかも関数であるかのように扱うことができます。関数オブジェクトおよびそのためのヘッダである <functional> は従来の標準C++ライブラリにもありましたが、TR1 ではさらに機能が拡張されています。
ヘッダ
Boost C++ Libraries の場合には、<boost/utility/result_of.hpp> のように、専用のヘッダファイルがありましたが、TR1 では std::unary_function などと同じ <functional> をインクルードします。
3.2 weak_ptr
std::tr1::weak_ptr は、std::tr1::shared_ptr が管理しているオブジェクトへの 弱い(weak) 参照を保持します。std::tr1::weak_ptr の詳細は boost::weak_ptr を参照してください。
3.1 shared_ptr
std::tr1::shared_ptr は、参照カウンタを用いた高機能なスマートポインタです。std::tr1::shared_ptr の詳細な仕様は、boost::shared_ptr を参照してください。ここでは、主な仕様をかいつまんで解説することにします。
3. スマートポインタ
概要
「スマートポインタ」というのは、文字通り「気の利いたポインタ」のことです。C++では、動的なオブジェクトを扱うには、new で生成して、delete で解放するのが基本です。しかし、この方法では、ポインタを持ちまわっているうちに、解放忘れや二重解放、あるいは解放済みのオブジェクトを参照するといった、よくあるバグに遭遇しがちです。スマートポインタはそうした問題を解消してくれます。
