gpt4 book ai didi

c++ - 在函数指针之间转换

转载 作者:太空狗 更新时间:2023-10-29 20:49:08 25 4
gpt4 key购买 nike

我目前正在使用 Don Clugston 的 fastdelegates 实现计时器/回调系统。 (参见 http://www.codeproject.com/KB/cpp/FastDelegate.aspx)

这是开始的代码:

struct TimerContext
{
};

void free_func( TimerContext* )
{
}

struct Foo
{
void member_func( TimerContext* )
{
}
};

Foo f;
MulticastDelegate< void (TimerContext*) > delegate;

delegate += free_func;
delegate += bind( &Foo::member_func, &f );

好的,但是现在,我希望用户能够子类化 TimerContext 来存储他自己的结构并将其发送到回调。此处的目的是防止用户必须自己向下转型 TimerContext

struct TimerContext
{
};

struct MyTimerContext : TimerContext
{
int user_value;
};

void free_func( TimerContext* )
{
}

void free_func2( MyTimerContext* )
{
}

struct Foo
{
void member_func( TimerContext* )
{
}

void member_func2( MyTimerContext* )
{
}
};

Foo f;
MulticastDelegate< void (TimerContext*) > delegate;

delegate += free_func;
delegate += free_func2;
delegate += bind( &Foo::member_func, &f );
delegate += bind( &Foo::member_func2, &f );

如您所料,GCC 不会让我这样做:)

error: invalid conversion from `void (*)(MyTimerContext*)' to `void (*)(TimerContext*)'
error: initializing argument 1 of `delegate::Delegate<R ()(Param1)>::Delegate(R (*)(Param1)) [with R = void, Param1 = TimerContext*]'

所以现在我的问题是:如果我使用 reinterpret_cast 强制转换,它会起作用,但它安全吗?

PS:这些是时间关键的回调,大量面向虚拟的解决方案被认为是不切实际的:/

最佳答案

C++ 标准在 13.4/7 中说:

there are no standard conversions (clause 4) of one pointer-to-function type into another. In particular, even if B is a public base of D, we have

D* f();
B* (*p1)() = &f; // error
void g(D*);
void (*p2)(B*) = &g; // error

您仍然可以使用函数适配器来存储指向带有一个参数的函数的指针,例如 boost::function,但我现在不确定它是否能解决您的问题。

关于c++ - 在函数指针之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1589854/

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