小编JKS*_*KSH的帖子

如何使用libclang获取枚举元素的数值?

假设我有一个枚举定义,例如:

// myenum.h
enum MyEnum {
    First = 1,
    Second,
    Third,
    TwoAgain = Second
};
Run Code Online (Sandbox Code Playgroud)

我想以编程方式从任何给定的枚举定义生成一个映射,其中键是枚举元素的名称,值是枚举元素的数值(例如myMap["TwoAgain"] == 2)

到目前为止,我知道如何使用遍历源文件clang_visitChildren(),并使用提取单个标记clang_tokenize().通过AST递归,我按以下顺序获取游标/标记:

  1. "MyEnum"(CXType_Enum)
    • "第一"(CXToken_Identifier)
    • "="(CXToken_Punctuation)
    • "1"(CXToken_Literal)
  2. "unsigned int"(CXType_UInt)
    • "1"(CXToken_Literal)
  3. "MyEnum"(CXType_Enum)
    • "第二"(CXToken_Identifier)
  4. "MyEnum"(CXType_Enum)
    • "第三"(CXToken_Identifier)
  5. "MyEnum"(CXType_Enum)
    • "TwoAgain"(CXToken_Identifier)
    • "="(CXToken_Punctuation)
    • "第二"(CXToken_Identifier)
  6. "unsigned int"(CXType_UInt)
    • "第二"(CXToken_Identifier)

我想我可以编写一个算法,使用这些信息来计算每个值.但是,我想知道是否有更简单的方法?我可以直接从libclang API获取数值吗?

c++ enums libclang

7
推荐指数
1
解决办法
1083
查看次数

存储函数及其(任意类型,任意数)参数的简洁方法

对于一个库,我想要一个接受另一个函数及其参数的函数,然后将它们存储起来以便以后调用.参数必须允许任何类型的混合,但函数只需要返回void.像这样的东西:

void myFunc1(int arg1, float arg2);
void myFunc2(const char *arg1);
class DelayedCaller
{ ...
public:
    static DelayedCaller *setup(Function func, …);
};

...
DelayedCaller* caller1 = DelayedCaller::setup(&myFunc1, 123, 45.6);
DelayedCaller* caller2 = DelayedCaller::setup(&myFunc2, "A string");

caller1->call(); // Calls myFunc1(), with arguments 123 and 45.6
caller2->call(); // Calls myFunc2(), with argument "A string"
Run Code Online (Sandbox Code Playgroud)

一种方法是让DelayedCaller :: setup()接受一个std :: function,让我的库用户在调用setup()之前使用std :: bind().但是,有没有办法实现setup(),以便用户不需要自己进行绑定?

编辑:DelayedCaller是一个现有的类.setup()是一个我想添加的新静态方法.

c++ variadic c++11

5
推荐指数
2
解决办法
1758
查看次数

标签 统计

c++ ×2

c++11 ×1

enums ×1

libclang ×1

variadic ×1