gpt4 book ai didi

c++ - 我如何从成员函数的地址中获取成员函数的成分?

转载 作者:行者123 更新时间:2023-11-30 00:59:34 24 4
gpt4 key购买 nike

是否可以仅从其地址(而不是从成员函数类型)获取成员函数的组成部分,例如类类型或返回类型?

例如给出

 class foo
{
int bar()
{
return 5;
}
};

我喜欢吃

is_same< function_types<&foo::bar>::class_type, foo>::value == true; 

另外我还知道成员函数有一个像 R (C::*)() 这样的签名,即没有参数也没有 cv 限定。

谢谢。

最佳答案

您可以在模板函数中捕获类型:

#include <iostream>

struct foo {
foo() { std::cout << "OK\n"; }
int bar() {return 0;}
};

template<typename C, typename R>
bool thing(R (C::*)()) {
C x;
}

int main() {
thing(&foo::bar);
}

打印“OK”,这样你就可以把你的 is_same 检查在那里。不过,我真的不确定问题是什么 - 显然,我们使用成员函数的类型来推导模板参数。

如果您以某种方式无效地reinterpret_cast 一个指向其他对象的成员函数指针,以便丢弃它的类型,那么不,您无法恢复它。

如果您已将成员函数指针转换为兼容的成员函数指针类型,例如 R (B::*)() -> R (D::*) (),其中B是D的基类,那么我想你可以使用dynamic_cast来测试它是否真的是一个B函数。您不能那样恢复类型,只能恢复成员函数指针的 typeid,因为它是运行时操作。在 C++ 中,类型实际上仅存在于编译时,因此无法“获取”值的动态类型,无论该值是成员函数指针还是其他任何东西。编译器要么知道它,要么不知道,如果它知道,那么就会有各种模板技巧来实际使用该类型的组成部分。

关于c++ - 我如何从成员函数的地址中获取成员函数的成分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4166489/

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