gpt4 book ai didi

c++ - 存储或反射(reflect)在变量的 "reference level"

转载 作者:太空狗 更新时间:2023-10-29 23:37:34 24 4
gpt4 key购买 nike

C++有没有办法反射(reflect)一个变量的“指针的层数”,(比如int* a是1层,int** b为2级,int c为0级)

.. 除了使用 typeid 并解析由此产生的字符串外?

我问的原因是我正在使用 pointers to member functions ,我需要知道是否真的在编译时将成员函数调用为 obj->func()obj.func()

最佳答案

如果 obj 是一个 T**,则执行 obj.*foo 是病式的。所以只需要搞清楚是指针还是非指针就可以了。您可以为此使用重载。

template<typename T, typename M> void f(T *obj, M m) { // pointer
(obj->*m)();
}

template<typename T, typename M> void f(T &obj, M m) { // not a pointer
(obj.*m)();
}

它的缺点是它只适用于零参数成员函数指针,并且不会返回那些函数返回的值(如果有的话)。您不能执行以下操作(很容易实现),因为两个分支都将进行类型检查

if(is_pointer(obj)) v = (obj->*m)(arg...); else v = (obj.*m)(args...);

可以做的就是调用一个函数来取消引用你的对象,如果它是一个指针的话

template<typename T> T &deref(T *t) { return *t; }
template<typename T> T &deref(T &t) { return t; }

然后你可以说

v = (deref(obj).*m)(args...);

关于c++ - 存储或反射(reflect)在变量的 "reference level",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6238216/

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