将指向成员函数的指针作为void*函数的参数传递
Passing a pointer to a member function as argument for a void* function
我有以下功能:
void PerformAction(void(*pf_action)());
以及以下类别:
class A
{
public:
void DoSomething();
}
我希望能够做到这一点:
int main()
{
A a;
PerformAction(&(a.DoSomething);
return 0;
}
我已经看到很多答案说函数签名应该是:
void PerformAction(void(A::*)());
这不是我想要的
我希望能够向它传递任何不接收参数并返回void的函数/方法。不仅仅是A的成员方法,也不仅仅是全局函数。
这在C++中可能吗?
普通函数指针和成员函数指针是不同的。
成员函数采用隐藏的this
参数,而普通函数则不采用。要通过指针调用成员函数,需要一个对象来初始化该this
参数。
因此,您无法将指向非静态成员函数的指针转换为纯函数指针,并在不传入对象的情况下通过它进行调用。
我希望能够向它传递任何不接收参数并返回void的函数/方法。不仅仅是A的成员方法,也不仅仅是全局函数。
这在C++中可能吗?
是的,这是可能的,但您需要使用更灵活的类型。实现这一点的方法是用不同的类型指定PerformAction
函数。您希望使用一个可以用零参数调用并返回void
、std::function<void ()>
的类型。例如,将PerformAction
函数更改为:void PerformAction(std::function<void ()> fn);
。这个版本将允许您接受任何可以用零参数调用并返回void
的内容,请参阅下面的代码以获取示例。
示例代码
#include <functional>
#include <iostream>
class Foo
{
public:
void bar() { std::cout << "Member function: Foo::bar()n"; }
};
void bar()
{
std::cout << "Free function: bar()n";
}
class Functor
{
public:
void operator()() { std::cout << "Functor objectn"; }
};
auto lambda = []() { std::cout << "Lambda expressionn"; };
void doSomething(std::function<void ()> fn)
{
fn();
}
int main()
{
doSomething(bar);
doSomething(Functor());
doSomething(lambda);
Foo foo;
doSomething(std::bind(&Foo::bar, &foo));
return 0;
}
实际示例
输出示例
Free function: bar()
Functor object
Lambda expression
Member function: Foo::bar()
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么全局函数 void showA(A&x) 能够访问 A 类的私有成员?
- 如何将函数<void()>写入管道/套接字对?
- 错误:无法在没有对象的情况下调用成员函数'void Fortest::run()'|
- 标准的大小::函数<void(int&)>类型
- 如何函数<void(字符串消息)>绑定到成员函数?
- 函数void()返回一个值,而不是char或string
- 函数void QQuickWindow::setDefaultAlphaBuffer(bool useAlpha)的用途
- 错误 LNK2019:函数 "void __cdecl Padding(int)" 中引用未解析的外部符号___iob_func
- 我可以有一个~析构函数(void)吗?
- 函数<void(T)> 带有默认参数的参数
- 错误:参数太少,无法函数"void alpha(std::string*,student)"