gpt4 book ai didi

c++ - 使用可变参数宏生成数组

转载 作者:行者123 更新时间:2023-11-30 02:49:47 27 4
gpt4 key购买 nike

我想使用可变参数宏生成一个函数指针数组。这是一个例子。


预处理前:

#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];
}

这可能吗?

基本上,我需要在数组扩展之前有一些东西,在数组扩展之后有一些东西,并为每个扩展的可变参数宏参数添加一个前缀。

最佳答案

使用 boost 的预处理器库(虽然在 clang++ 和可变参数 o.O 上有问题,但在 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

关于c++ - 使用可变参数宏生成数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com