gpt4 book ai didi

c++ - 如何使用 std::function 编写指向成员函数的指针?

转载 作者:IT老高 更新时间:2023-10-28 12:45:30 26 4
gpt4 key购买 nike

我知道如何声明int fn(double)在 std::function ( std::function<int(double)> ) 内部。我知道如何编写指向成员函数的指针(typedef int (A::*MemFn)(double d);)。但是如何使用 std::function 编写指向成员函数的指针?

如果您想编译/测试,请使用虚拟代码

-edit- 基于答案,我认为我将只使用 typedef 而不会打扰 std::function

#include <cstdio>
#include <functional>

struct A{ int fn(double){ return 0; } };
int fn2(double){ return 0; }

typedef int (A::*MemFn)(double d);
typedef std::function<int(double)> MemFn2;

void Test(A*a, MemFn2 fn){
fn(1.2f);
}
void Test(A*a, MemFn fn){
(a->*fn)(1.2f);
}

int main(){
Test(new A, &A::fn);
Test(new A, &fn2);
}

最佳答案

std::function 完全能够直接存储成员函数指针。但是,您必须适本地调整参数列表。成员指针必须使用该类型(或派生类型)的实例来调用。将它们放入 std::function 时,参数列表中的第一个参数应该是指向对象类型的指针(或引用或智能指针)。

所以,如果我有以下类(class):

struct Type
{
public:
int Foo();
};

将此成员函数存储在 std::function 中的正确语法是:

std::function<int(Type&)> fooCaller = &Type::Foo;

如果您想保留参数列表(在您的情况下为 int(double)),那么您需要在 function 之外提供实例。这可以通过 std::bind:

来完成
struct A{ int fn(double){ return 0; } };

A anInstance;
std::function<int(double)> fnCaller = std::bind(&A::fn, &anInstance, std::placeholders::_1);

请注意,您有责任确保您提供给 std::bind 的对象指针只要 fnCaller 仍然有效活。如果你将 fnCaller 返回给某人,并且它有一个指向堆栈对象的指针,那么你就有麻烦了。

由于函数调用机制的定义方式,您可以将 shared_ptr(或任何可复制的智能指针)绑定(bind)为您的对象:

struct A{ int fn(double){ return 0; } };

auto anInstance = std::make_shared<A>();
std::function<int(double)> fnCaller = std::bind(&A::fn, anInstance, std::placeholders::_1);

现在您不必担心; binder 将继续保持对象处于事件状态,因为它按值存储 shared_ptr

关于c++ - 如何使用 std::function 编写指向成员函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9281172/

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