gpt4 book ai didi

python - 使用 python 绑定(bind)来检查 C++ 类型是否以规范方式是指针、引用等?

转载 作者:行者123 更新时间:2023-12-01 14:50:00 26 4
gpt4 key购买 nike

考虑一个对象 t类型 clang.cindex.Type表示 C++ 变量声明,例如 const T& x;或发生在类似的参数声明

template<typename... Ts> void f(Ts&&...);

Is there a canonical way to determine if t is/represents (1) a pointer, (2) a lvalue or rvalue reference, (3) a parameter pack?

Obviously, by manually parsing t.spelling, one can solve the above problems, roughly as follows: Assume that the file x.h contains

const T & x;

Then the following code will print True:

import clang
from clang import cindex

def is_lvalue_ref(type):
spell = type.spelling # 'const T &'
tokens = spell.split(' ') # ['const', 'T', '&']
return (tokens[-1] == '&')
cindex.Config.set_library_path('/Library/Developer/CommandLineTools/usr/lib')
index = cindex.Index.create()
tu = index.parse('x.h', ['c++', '-std=c++17'])
for x in tu.cursor.get_children():
# x is CursorKind.VAR_DECL
print(is_lvalue_ref(x.type))
(对于指针或参数包,类似地进行。)
但显然,这是不可取的!有没有规范的方法来实现这一目标?

最佳答案

我想我现在已经很晚了,但是我遇到了同样的问题并以规范的方式解决了。
每当您有 PARM_DECL您可以了解是否以这种方式应用了某些限定符:

node.type.get_pointee().is_const_qualified()
如果参数声明具有 const,则返回 True限定符,例如:
const string &
编辑:
我终于找到了解决方案:一旦你有 typekind您只需访问属性 kind 的对象如果它是一个引用,它的种类将是 TypeKind.LVALUEREFERENCE。
node.type.kind
如果要访问引用的底层类型需要通过get_pointee()来获取,所以
node.type.get_pointee().spelling

关于python - 使用 python 绑定(bind)来检查 C++ 类型是否以规范方式是指针、引用等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57427765/

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