1

可変個引数マクロを使用して、関数ポインターの配列を生成したいと考えています。これが例です。


前処理前:

#define MY_MACRO(mClassName, ...) ???

struct test { 
    void a() { }
    void b() { }
    void c() { }
};

MY_MACRO(test, a, b, c);

前処理後:

struct test { 
    void a() { }
    void b() { }
    void c() { }
};

void(test::*)() getMemFnPtr(int mIdx) {
    static void(test::*)() fnPtrs[]{
        &test::a,
        &test::b,
        &test::c
    };
    return fnPtrs[mIdx];
}

これは可能ですか?

基本的に、配列展開の前に何か、配列展開の後に何かが必要であり、展開されたすべての可変長マクロ引数に接頭辞を追加する必要があります。

4

1 に答える 1

3

boost のプリプロセッサ ライブラリを使用する (clang++ と可変引数 oO には問題がありますが、g++ では問題なく動作します):

#include <boost/preprocessor/facilities/expand.hpp>
#include <boost/preprocessor/seq/transform.hpp>
#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>

#define CREATE_MFPTR(s, data, elem) \
    & BOOST_PP_EXPAND(data) :: BOOST_PP_EXPAND(elem)

#define CREATE_MFPTRS(class_name, ...)                                  \
    BOOST_PP_SEQ_ENUM(                                                  \
        BOOST_PP_SEQ_TRANSFORM(CREATE_MFPTR,                            \
                               class_name,                              \
                               BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))   \
    )                                                                   // end



struct test
{
    void a();
    void b();
    void c();
    void d();
};

using MFPtr = void (test::*)();
MFPtr arr[] = {
    CREATE_MFPTRS(test, a,b,c,d)
};

int main() {}

CREATE_MFPTRS(test, a,b,c,d)利回り_

& test :: a, & test :: b, & test :: c, & test :: d
于 2014-01-04T19:47:52.343 に答える