预处理器宏连接以构建类功能

时间:2015-01-06 02:45:27

标签: c++ concatenation c-preprocessor

我需要一个POD配置结构数组,其中包含一些长命名类中静态函数的指针,例如。

typedef void (*MyFn)();

struct MyData {
    MyFn myFn;
    ...
};

...
struct MyData const configArr[] = {
    { ... },
    ...
};

要使用的函数类似于void AClass::AnotherClass::YetAnotherClass::someFn();

我看到三个选项:

  1. configArr成为AClass::AnotheClass::YetAnotherClass的成员,
  2. 在配置中使用全名。我不喜欢他们中的任何一个,
  3. 我尝试了通常的两级预处理器连接,它抱怨:
      

    '粘贴" ::"和" xxx"没有提供有效的预处理令牌'。

  4. 我想出的最好的事情是为conf中使用的所有函数设置一些公共前缀。

    即:AClass::...::prefSomeFn();并使用' AClass :: ... :: pref'的串联和' SomeFn'它有效,但它看起来仍然太难看了。

    有没有更好的出路?

1 个答案:

答案 0 :(得分:1)

  

'粘贴'::“和”xxx“不提供有效的预处理令牌。

那是因为他们单独的令牌;你不需要粘贴它们,只需将它们放在扩展中:

struct ClassWithALongName { int i; };
#define X(MemberId) &ClassWithALongName::MemberId
auto ptr = X(i);