运行 时间选择方法使用 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
的值,选择必要的实现(f1
或 f2
)。然后在 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
导致绑定当前对象的副本,请改用 this
或 std::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);
我需要在 运行 时选择 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
的值,选择必要的实现(f1
或 f2
)。然后在 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
导致绑定当前对象的副本,请改用 this
或 std::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);