PayOff是一个抽象的基类,CallPayOff和PutPayOff都是从它派生出来的。调用运算符在基类中被定义为纯虚函数,CallPayOff 和 PutPayoff 提供了自己的实现。
vector<PayOff*> v;
v.push_back(new CallPayOff(20));
v.push_back(new PutPayOff(20));
vector<double> payVals;
payVals.reserve(v.size());
transform(v.begin(), v.end(), back_inserter(payVals), bind2nd(mem_fun(&PayOff::operator()),this));
呼叫运营商定义为:
class PayOff
{
public:
virtual double operator()(double spot)const = 0;
virtual ~PayOff(){}
};
谁能看看?提升/C++11 不是一个选项。
transform(v.begin(), v.end(), payVals.begin(),
bind2nd(mem_fun(&PayOff::operator()),this));
必须在呼叫发生的位置查找和解析呼叫transform
中的名称。根据您的评论,这是main
.在main
内部,您不能使用this
。
如果您有 C++11 编译器,您可以选择使用 lambda 或 std::bind
:
std::transform(std::begin(v), std::end(v),
std::begin(payVals),
[](PayOff* p) { (*p)(value); });
std::transform(std::begin(v), std::end(v),
std::begin(payVals),
std::bind(&Payoff::operator(), _1, value); // using std::placeholders::_1
在 C++03 中,您可以使用 boost::bind
而不是 std::bind
,或者如果不可用,您可以创建自己的函子或适配器函子,它们将在参数上调用operator()
。
你没有说你期望transform
做什么;大概是在某个值上调用每个PayOff
对象。在这种情况下,函子应该是:
bind2nd(mem_fun(&PayOff::operator()),some_value)
或者,对于那些没有停留在过去的人,
[=](PayOff* p){(*p)(some_value;}}
或
bind(&PayOff::operator(), _1, some_value);
相反,您正在尝试绑定到全局函数中不存在的this
。在成员函数中,它将存在,但作为期望double
的函子的参数没有意义。
如果从主函数调用 transform,则不存在this
。
看起来您应该提供如下双精度(而不是上面建议的足尖(:
const double spot(99.);
transform(v.begin(), v.end(), payVals.begin(), bind2nd(mem_fun(&PayOff::operator()),spot));
附言我没有检查过你的语法,但本质上这是在 c++11 之前的代码中如何做的。