在使用某些C++库时,我经常遇到参数需要指向函数的函数。这意味着方法将不被接受。
比如性病的atexit(void (__cdecl*)(void));
在这种情况下,当您想从方法传递功能时,从类调用此类函数非常不方便。
我知道这两种解决方法,但它们有缺点/似乎不可能:
- 将方法声明为静态:表示该方法不能调用任何 来自同一类的其他非静态方法。
- 传递实际函数:绝对是一团糟,可能需要所有 各种黑魔法来执行propper功能 在方法内。
对于这些情况,通常还有哪些其他解决方法?或者至少对于从一个类调用 atexit(( 示例,其中一种方法作为退出函数是理想的。
atexit
函数在程序退出时以相反的顺序调用。此时还调用本地静态对象析构函数。所以在这个例子中:
void f()
{
static X x;
atexit(f1);
static Y y;
}
在第一次调用时,x
和y
析构函数将被注册为在程序退出时调用,并且f1()
将在y.Y::~Y()
和x.X::~X()
之间调用。
因此,如果创建要在销毁集合时调用的std::function
对象的集合,这可能是一种可行的解决方法。
它仍然可能无法很好地用于多个函数,因为所有函数都将在单个循环中调用,而不是相对于其他静态析构函数/退出调用的 LIFO 顺序。
另一种选择可能是查看at_thread_exit
.它具有不同的语义,但也可能满足您的需求。
@Remy Lebeau提到的Thunk可能是最好的解决方法。但实施起来可能并不容易,这就是为什么我建议也考虑其他解决方法。