-1

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(){}
};

任何人都可以看看吗?Boost/C++11 不是一个选项。

4

4 回答 4

2
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()参数。

于 2013-08-19T14:05:50.190 回答
1

你没有说你期望transform做什么;大概是在某个值上调用每个PayOff对象。在这种情况下,函子应该是:

bind2nd(mem_fun(&PayOff::operator()),some_value)

或者,对于那些没有停留在过去的人,

[=](PayOff* p){(*p)(some_value;}}

或者

bind(&PayOff::operator(), _1, some_value);

相反,您正在尝试绑定到this全局函数中不存在的对象。在成员函数中,它会存在,但作为期望 a 的仿函数的参数没有意义double

于 2013-08-19T14:08:33.580 回答
0

如果您从主函数调用转换,this则不存在。

于 2013-08-19T14:08:02.977 回答
0

看起来您应该按如下方式提供双精度(不是上面建议的指针):

const double spot(99.);
transform(v.begin(), v.end(), payVals.begin(),  bind2nd(mem_fun(&PayOff::operator()),spot));

PS我没有检查你的语法,但本质上这是如何在 pre-c++11 代码中做的。

于 2013-08-19T14:49:30.383 回答