有没有任何方法可以在不更改参数的情况下更改回调的范围
Is there any way to change the scope of a callback without changing the paramaters?
我使用的是SDL2_mixer库,但我认为这个问题也适用于一般情况。
目前,我想使用的函数Mix_HookMusicFinished(void (*music_finished)(void))
有一个到C风格函数全局范围的集合回调。但是,我希望将该回调设置为我自己的类void CMusic::musicFinished()
中的成员函数,而不需要全局范围内的函数。
有办法这样做吗?像Mix_HookMusicFinished(musicFinished)
这样的东西会很好,但它直接有一个argument of type "void (CMusic::*)()" is incompatible with parameter of type "void (*)()"
的错误
您需要创建一个"包装器"函数。然而,这里的问题是,你还需要能够找到你想要"完成"的CMusic
对象——这才是的关键所在
类型为的参数。。。与不兼容。。。
都是关于。由于无法将参数传递给musicFinished
对象,因此需要其他方法来"查找"CMusic
对象。
如果我们假设有一种方法可以做到这一点,那么这样的方法就会奏效:
class CMusic
{
...
public:
...
static void musicFinishedWrapper();
void musicFinished();
...
};
void CMusic::musicFinishedWrapper()
{
CMusic* music = getTheMusicSomehow(); // No idea how you do this - depends on your code.
music->musicFinished();
}
你必须有一个CMusic对象的原因是你的musicFinished
需要一个(隐藏的)this
指针参数——这是我的小函数中music
的值。
您可以将musicFinished
移动到CMusic
类中,并将其声明为static
类方法。static
类方法不在对象上调用;因此,它们没有用于指定this
指针值的隐式参数,因此它们可以具有与独立函数相同的签名。您还可以将其设为private
,以防止除CMusic
之外的任何东西使用它。
然而,由于您的musicFinished
方法目前是一个独立函数,因此可能不需要访问CMusic
的protected
或private
成员,并且由于您限制其范围的努力可能意味着您不希望其他东西调用它,我个人会将您的musicFinished
函数保留为独立函数,但在CMusic
源(.cpp
或.cc
)文件中将其声明为static
(或将其移动到匿名命名空间,如果您愿意的话)。这样做会将其范围限制在源文件("编译单元")。与private
、static
类方法相比,一个优点是它根本不需要在头文件中公开,因此在某种意义上它更私有。
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- 是否可以在不扣除的情况下将模板参数转发到 make_*?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如何在给定 std::variant 的情况下检索模板参数包?
- 在C++中,有没有一种方法可以让我在不传递参数的情况下拥有一个函数
- 如何在没有参数包的情况下编写变差函数
- 如何在不使用文件扩展名的情况下使用命令行参数打开C++中的文本文件?
- 此函数如何在不传递任何参数的情况下工作?
- 在什么情况下,使用'const T*'输入参数比'const T&'更可取?
- 如何在没有可变参数函数的情况下循环函数的参数
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?