使用union的函数指针转换

时间:2013-10-20 01:03:33

标签: c++ c++11 visual-c++-2010

typedef void (*callable_function)(double);
void call_function(callable_function func)
{
    func(3.0);
}

class Foo;

union converter {
    callable_function func;
    void (Foo::*foo_func)(void);
};

class Foo {
private:
    double d;
public:
    Foo(void) : d(0.0)
    {
        converter c;
        c.foo_func = &Foo::set_double;
        call_function(c.func);//I know i can call the function directly, but that is not what i want to achieve
    }

    void set_double(double value)
    {
        d = value;
    }
};

void main(void)
{
    Foo foo;
}

当尝试执行上面的代码时,我在行中遇到堆损坏错误: d = value;
可能是因为被调用的函数是类函数,而不是成员函数。

但是,如果我尝试更改此行:c.foo_func = &Foo::set_double;c.foo_func = &this->set_double;,我会收到此编译错误:

error C2276: '&' : illegal operation on bound member function expression

问题#1:有没有办法将指针(可能正在转换)从void(Foo::*)(void)转换为void()(void)或修复编译器错误?

1 个答案:

答案 0 :(得分:0)

指向“free”函数的指针和指向C ++中成员函数的指针具有不同的大小。 这意味着你技术上可以将指针释放到void * ptr的自由函数,因为它们通常具有相同的大小,但你不能将成员函数指针转换为void *或其他自由函数 - 你将得到你所拥有的得到。

请检查:Pointers to members representations