C++ std::bind 函数作为类变量中的参数存储

问题描述

我有以下问题。 class A 实现了一些应该在 B 类中处理的数据集上使用的例程。这意味着我正在从 start 调用函数 class A。我正在做的事情应该保存在 m 中的变量 class A 中。到现在为止还挺好。但是,在访问类变量m时,它仍然处于初始化时的状态。

准确地说:

#include <iostream>
#include <functional>

class A {
    public:
        int m;
        A() {
            m = 100;
        }
        void start(int value) {
            std::cout << "hello there!" << std::endl;
            m = value;
        }
};

class B {
    private:
        int m;
    public:
        void doSomething() {
            A a;
            doSomething2(std::bind(&A::start,a,std::placeholders::_1));
            
            // access variable m of instance a
            std::cout << a.m << std::endl;

        }
        template <typename Callable>
        void doSomething2(Callable f) {
            int val = 4444;
            f(val);
        }
};

main()
{
    B b;
    b.doSomething();
}

执行此操作时,我将获得 100 作为 m输出。我如何才能将调用 start 所做的更改存储在类变量中?意思是,在这个例子中存储值 4444?谢谢

解决方法

看起来您需要确保 std::bind 使用指向您创建的实际类实例的指针。尝试将其更改为:

// notice I've got '&a' here instead of just 'a'
doSomething2(std::bind(&A::start,&a,std::placeholders::_1));

如果没有这个,我猜 bind 现在正在做的是制作 a 实例的副本,然后修改该实例而不是原地更改。

,

默认情况下绑定采用值参数,结果 _imagePicked 作用于对象 start() 的副本。你必须通过引用传递它:

a

可能的替代方法是使用 lambda 表达式。