用于构建 class 函数的预处理器宏连接
Pre-processor macro concatenation to build class function
我需要一个 POD 配置结构数组,其中包含指向某些长名称 class 中的静态函数的指针,例如
typedef void (*MyFn)();
struct MyData {
MyFn myFn;
...
};
...
struct MyData const configArr[] = {
{ ... },
...
};
要使用的函数看起来像void AClass::AnotherClass::YetAnotherClass::someFn();
我看到三个选项:
- 让
configArr
成为 AClass::AnotheClass::YetAnotherClass
的成员,
- 在配置中使用全名。我也不喜欢他们,
- 我尝试了通常的两级预处理器连接,它抱怨说:
'pasting "::" and "xxx" does not give a valid preprocessing token'.
我想出的最好的办法是为 conf 中使用的所有函数设置一些通用前缀。
即:AClass::...::prefSomeFn()
;并使用 'AClass::...::pref' 和 'SomeFn' 的连接它有效,但它仍然看起来太丑了。
有没有更好的出路?
'pasting "::" and "xxx" does not give a valid preprocessing token'.
那是因为它们 是 独立的标记;您不需要粘贴它们,只需将它们放在扩展中相邻即可:
struct ClassWithALongName { int i; };
#define X(MemberId) &ClassWithALongName::MemberId
auto ptr = X(i);
我需要一个 POD 配置结构数组,其中包含指向某些长名称 class 中的静态函数的指针,例如
typedef void (*MyFn)();
struct MyData {
MyFn myFn;
...
};
...
struct MyData const configArr[] = {
{ ... },
...
};
要使用的函数看起来像void AClass::AnotherClass::YetAnotherClass::someFn();
我看到三个选项:
- 让
configArr
成为AClass::AnotheClass::YetAnotherClass
的成员, - 在配置中使用全名。我也不喜欢他们,
- 我尝试了通常的两级预处理器连接,它抱怨说:
'pasting "::" and "xxx" does not give a valid preprocessing token'.
我想出的最好的办法是为 conf 中使用的所有函数设置一些通用前缀。
即:AClass::...::prefSomeFn()
;并使用 'AClass::...::pref' 和 'SomeFn' 的连接它有效,但它仍然看起来太丑了。
有没有更好的出路?
'pasting "::" and "xxx" does not give a valid preprocessing token'.
那是因为它们 是 独立的标记;您不需要粘贴它们,只需将它们放在扩展中相邻即可:
struct ClassWithALongName { int i; };
#define X(MemberId) &ClassWithALongName::MemberId
auto ptr = X(i);