0

コンパイル時に文字列のコンテナが必要です。これは実行時に反復可能でなければなりません。ただし、いくつかの関数が生成されるように、マクロが本当に必要です (名前空間レベルでテンプレート化されたコードでそれを行う方法が思いつきません)。

しかし、次のコードでは、「エラー: 'class LaLaLa' の 'sequence' は型に名前を付けていません」というメッセージが表示されます。これは、ASSIGN マクロ内で発生します (私はそう思います)。誰かがこれで私を助けることができますか?

#define CREATE_FUNCTION(r, data, i, elem) // creates a function with name 'do_something_with_##elem()'

#define ASSIGN(r, data, i, elem) data::sequence[i] = elem;

#define TO_ARRAY(name, _seq)                                          \
    BOOST_PP_SEQ_FOR_EACH(CREATE_FUNCTION, _, _seq)                   \
    class name                                                        \
    {                                                                 \
    public:                                                           \
        static constexpr std::size_t size = BOOST_PP_SEQ_SIZE(_seq);  \
        static std::string sequence[size];                            \
    };                                                                \
    BOOST_PP_SEQ_FOR_EACH_I(ASSIGN, name, _seq)


TO_ARRAY(LaLaLa, (x)(y)(z)(a))

次に、次のように使用したいと思います。

do_something_with_x();
do_something_with_z();
std::vector<std::string> use_strings;
for(size_t i = 0; i < LaLaLa::size; ++i)
{
   use_strings.push_back(LaLaLa::sequence[i]);
}
// use_strings == {"x", "y", "z", "a"}
4

1 に答える 1

0

問題はプリプロセッサではありませんでした。クラス定義の直後にシーケンスを使用することが問題です。(関数内またはそのようなもの内で行う必要があります)

于 2013-03-03T13:19:40.580 に答える