gpt4 book ai didi

c++ - 如何在需要自由函数的地方传递成员函数?

转载 作者:太空宇宙 更新时间:2023-11-04 12:43:47 26 4
gpt4 key购买 nike

问题如下:考虑这段代码:

#include <iostream>


class aClass
{
public:
void aTest(int a, int b)
{
printf("%d + %d = %d", a, b, a + b);
}
};

void function1(void (*function)(int, int))
{
function(1, 1);
}

void test(int a,int b)
{
printf("%d - %d = %d", a , b , a - b);
}

int main()
{
aClass a;

function1(&test);
function1(&aClass::aTest); // <-- How should I point to a's aClass::test function?
}

如何使用aaClass::test 作为function1 的参数?我想访问类(class)的成员。

最佳答案

使用函数指针没有任何问题。但是,指向非静态成员函数的指针与普通函数指针不同:成员函数需要在作为隐式参数传递给函数的对象上调用。因此,您上面的成员函数的签名是

void (aClass::*)(int, int)

而不是你尝试使用的类型

void (*)(int, int)

一种方法可能包括使成员函数 static在这种情况下,它不需要调用任何对象,您可以将它与类型 void (*)(int, int) 一起使用.

如果您需要访问您的类的任何非静态成员并且您需要坚持使用函数指针,例如,因为该函数是 C 接口(interface)的一部分,您最好的选择是始终通过 void*您的函数采用函数指针并通过从 void* 获取对象的转发函数调用您的成员然后调用成员函数。

在适当的 C++ 接口(interface)中,您可能希望查看让您的函数采用模板化参数的函数对象以使用任意类类型。如果不希望使用模板化界面,则应使用类似 std::function<void(int, int)> 的东西: 您可以为这些创建一个合适的可调用函数对象,例如,使用 std::bind() .

类型安全方法使用类类型的模板参数或合适的 std::function<...>比使用 void* 更可取接口(interface),因为它们消除了由于转换为错误类型而导致错误的可能性。

为了阐明如何使用函数指针调用成员函数,这里有一个例子:

// the function using the function pointers:
void somefunction(void (*fptr)(void*, int, int), void* context) {
fptr(context, 17, 42);
}

void non_member(void*, int i0, int i1) {
std::cout << "I don't need any context! i0=" << i0 << " i1=" << i1 << "\n";
}

struct foo {
void member(int i0, int i1) {
std::cout << "member function: this=" << this << " i0=" << i0 << " i1=" << i1 << "\n";
}
};

void forwarder(void* context, int i0, int i1) {
static_cast<foo*>(context)->member(i0, i1);
}

int main() {
somefunction(&non_member, nullptr);
foo object;
somefunction(&forwarder, &object);
}

关于c++ - 如何在需要自由函数的地方传递成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52780029/

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