構造体とクラスのメンバーを反復処理する
C は、構造体とクラスのメンバーを反復処理するためのさまざまなメカニズムを提供します。これを実現するには、いくつかのテクニックを使用できます。
マクロを使用した構造体の定義:
次の例に示すように、1 つのアプローチは REFLECTABLE マクロを使用することです。 :
struct A
{
REFLECTABLE
(
(int) a,
(int) b,
(int) c
)
};
このマクロを使用すると、次のようにフィールドを反復処理して値を出力することができます:
struct print_visitor
{
template
void operator()(FieldData f)
{
std::cout
void print_fields(T & x)
{
visit_each(x, print_visitor());
}
A x;
print_fields(x);
構造体を Fusion シーケンスとして適応させる:
もう 1 つのオプションは、構造体を Boost.Fusion シーケンスとして適応させることです。次の例を考えてみましょう:
struct A
{
int a;
int b;
int c;
};
BOOST_FUSION_ADAPT_STRUCT
(
A,
(int, a)
(int, b)
(int, c)
)
この適応により、次のコードを使用してフィールドを反復処理できます:
struct print_visitor
{
template
void operator()(Index, C & c)
{
std::cout ::call()
(c)
void print_fields(C & c)
{
typedef boost::mpl::range_c::type::value> range;
boost::mpl::for_each(boost::bind(print_visitor(), boost::ref(c), _1));
}
これらのテクニックを使用すると、C の構造体およびクラス メンバーを効果的に反復処理できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3