其他分享
首页 > 其他分享> > c – 如何通过需要自由函数的成员函数?

c – 如何通过需要自由函数的成员函数?

作者:互联网

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

#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 (int argc, const char* argv[])
{
    aClass a();

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

    return 0;
}

如何使用a的aClass :: test作为function1的参数?我坚持这样做.

我想访问该班级的成员.

解决方法:

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

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

而不是你尝试使用的类型

void (*)(int, int)

一种方法可能是使成员函数静态,在这种情况下,它不需要调用任何对象,您可以使用类型为void(*)(int,int).

如果你需要访问你的类的任何非静态成员,你需要坚持使用函数指针,例如,因为函数是C接口的一部分,你最好的选择是总是将void *传递给你的函数获取函数指针并通过转发函数调用您的成员,该函数从void *中获取对象,然后调用成员函数.

在适当的C接口中,您可能希望查看函数对函数对象的模板参数使用任意类类型.如果不希望使用模板化接口,则应使用类似std :: function< void(int,int)>的内容:您可以为这些创建适当可调用的函数对象,例如,使用std :: bind().

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

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

// 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, 0);
    foo object;
    somefunction(&forwarder, &object);
}

标签:pointer-to-member,c,arguments,parameter-passing,function-pointers
来源: https://codeday.me/bug/20190915/1805274.html