运行 时间选择方法使用 std::bind。访问变量的问题

Run time choice of method using std::bind. Problem with access to variable

我需要在 运行 时选择 class 的特定方法。为此,我使用 std::bind。下面是一个演示我所做的示例:

#include<iostream>
#include<functional>
class bc {
public:
    bc(int, double);
    std::function<double(double)> f; //pointer to function which will be binded with f1 or f2 
    void setVal(double v) {val = v;} //method allowing to change val

    double val;  //some variable used by f1 and f2
    double f1(double v) {return 2*v*val;} 
    double f2(double v) {return 3*v*val;}
};

bc::bc(int fid, double v)    //depends on fid the f1 or f2 is chosen for binding
{
    using namespace std::placeholders;
    this->val = v;
    if(fid == 1)
        f = std::bind(&bc::f1, *this, _1);
    else
        f = std::bind(&bc::f2, *this, _1);
}

因此,根据提供给构造函数的 fid 的值,选择必要的实现(f1f2)。然后在 main:

int main()
{
    bc my(1, 2.0);
    std::cout << my.f(1) << std::endl; //1
    my.setVal(5.0);
    std::cout << my.f(1) << std::endl; //2
    return 0;
}

字符串 //1 的第一个输出符合预期: 4 。 但是第二个输出(//2)也是4,而它应该是10,因为val的值应该被[=改为5 26=].

我希望在绑定阶段制作类似 class 的副本,并且 my.setVal(5.0)val 的更改对这个“副本”没有影响".

我该如何解决这个问题?或者可能有更好的方法在某些函数的多个实现之间做出 运行 时间选择。

*this 导致绑定当前对象的副本,请改用 thisstd::ref(*this)

在将 this 传递给 std::bind 之前不要取消引用它:

    if(fid == 1)
        f = std::bind(&bc::f1, this, _1);
    else
        f = std::bind(&bc::f2, this, _1);

默认情况下 std::bind 存储参数的副本,因此您最终在其中得到了 bc 的副本,并且更改原始的 val 字段没有任何效果。或者,您可以使用 std::reference_wrapper 来达到相同的效果:

    if(fid == 1)
        f = std::bind(&bc::f1, std::ref(*this), _1);
    else
        f = std::bind(&bc::f2, std::ref(*this), _1);