gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:55:55 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/12662891/

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