3

したがって、この回答によると、C ++は可変個引数マクロをサポートしておらず、C++標準は可変個引数マクロについてどこにも言及していません。C99で可変個引数マクロが導入されたことは知っています__VA_ARGS__。特定のC++コンパイラ(GCCなど)は、C ++でこれを可能にする拡張機能も提供しますが、可変個引数マクロは単に標準C++の一部ではないという事実は変わりません。

BOOST_FUSION_ADAPT_STRUCT現在、Boost.Fusionには、マクロを使用してFusionシーケンスを任意のクラスまたは構造体にバインドできる機能があります。これにより、クラスまたは構造体をFusionシーケンスであるかのように使用できます。

これがどのように使用されるかの例を次に示します(Boostドキュメントから取得)。

namespace demo
{
    struct employee
    {
        std::string name;
        int age;
    };
}

// demo::employee is now a Fusion sequence
BOOST_FUSION_ADAPT_STRUCT(
    demo::employee,
    (std::string, name)
    (int, age))

さて、このコードは可変個引数マクロなしでどのように可能ですか?マクロはBOOST_FUSION_ADAPT_STRUCT、おそらく任意のユーザー定義のクラスまたは構造体で機能できるため、任意の数の引数を取るようです。

Boostは興味深い方法でC++を曲げることで有名ですが、これはコンパイラのサポートなしではまったく不可能に思えます。では、Boost.Fusionはこれを実現するためにどのような魔法を使っているのでしょうか。

PS:はい、Boostがオープンソースであることは知っています。私が最初にしたことは、ソースコードを見ることでした。どういうわけかマクロを連結するためにBoostプリプロセッサライブラリを使用しているようです。しかし、これが任意の数の引数に対してどのように機能するかはわかりません。ソースコードは、非常に高密度のプリプロセッサコードのコレクションであり、理解するのが非常に困難です。

4

1 に答える 1

2
BOOST_FUSION_ADAPT_STRUCT(
    demo::employee,
    (std::string, name)
    (int, age))

これは、2つの引数を取る単一のマクロです。引数1:demo :: employee引数2:(std :: string、name)(int、age)

引数2は文字列と連結されて、2つのパラメーターを受け取る別のマクロ呼び出しを形成します。

BOOST_FUSION_SOME_INTERNAL_MACRO(std::string, name)
BOOST_FUSION_SOME_INTERNAL_MACRO(int, age)
于 2011-05-18T14:22:49.130 に答える