我必须使用 boost::bind 来创建多态 "transform" 功能吗?
Must I use boost::bind to create polymorphic "transform" functionality?
我正在尝试使用指定参数调用向量中每个对象的成员函数,我希望调用是多态的。我相信下面显示的函数 vstuff 实现了这一点。但是 vstuff 可以修改成一个 vector< shared_ptr < Base> > 而不用 boost::bind 吗?
class Base{
virtual double stuff(double t);
}
//and some derived classes overriding stuff
//then in some code
vector<double> vstuff(double t, vector<Base*> things)
{
vector<double> vals;
vals.resize(things.size());
transform(things.begin(), things.end(), vals.begin(), std::bind2nd(std::mem_fun(&Base::stuff),t));
return vals;
}
我知道 shared_ptr 需要 mem_fn 而不是 mem_fun ,但是我没有成功地使 mem_fn 与我需要传递的 bind2nd 一起工作参数t,所以不知道是否可行.. ?
您也可以使用 std::bind
(或 lambda):
#include <algorithm>
#include <vector>
#include <memory>
struct Base {
virtual double stuff(double) { return 0; }
};
struct Threes : Base {
virtual double stuff(double) { return 3; }
};
struct Sevens : Base {
virtual double stuff(double) { return 7; }
};
std::vector<double> vstuff(double t, std::vector<std::shared_ptr<Base> > things)
{
std::vector<double> vals;
vals.resize(things.size());
transform(things.begin(), things.end(), vals.begin(), std::bind(&Base::stuff, std::placeholders::_1, t));
return vals;
}
#include <iostream>
int main() {
for (double v : vstuff(42, {
std::make_shared<Sevens>(),
std::make_shared<Sevens>(),
std::make_shared<Sevens>(),
std::make_shared<Threes>(),
std::make_shared<Sevens>(),
std::make_shared<Threes>(),
std::make_shared<Sevens>(),
std::make_shared<Sevens>(),
std::make_shared<Threes>(),
std::make_shared<Sevens>(),
}))
{
std::cout << v << " ";
}
}
版画
7 7 7 3 7 3 7 7 3 7
我正在尝试使用指定参数调用向量中每个对象的成员函数,我希望调用是多态的。我相信下面显示的函数 vstuff 实现了这一点。但是 vstuff 可以修改成一个 vector< shared_ptr < Base> > 而不用 boost::bind 吗?
class Base{
virtual double stuff(double t);
}
//and some derived classes overriding stuff
//then in some code
vector<double> vstuff(double t, vector<Base*> things)
{
vector<double> vals;
vals.resize(things.size());
transform(things.begin(), things.end(), vals.begin(), std::bind2nd(std::mem_fun(&Base::stuff),t));
return vals;
}
我知道 shared_ptr 需要 mem_fn 而不是 mem_fun ,但是我没有成功地使 mem_fn 与我需要传递的 bind2nd 一起工作参数t,所以不知道是否可行.. ?
您也可以使用 std::bind
(或 lambda):
#include <algorithm>
#include <vector>
#include <memory>
struct Base {
virtual double stuff(double) { return 0; }
};
struct Threes : Base {
virtual double stuff(double) { return 3; }
};
struct Sevens : Base {
virtual double stuff(double) { return 7; }
};
std::vector<double> vstuff(double t, std::vector<std::shared_ptr<Base> > things)
{
std::vector<double> vals;
vals.resize(things.size());
transform(things.begin(), things.end(), vals.begin(), std::bind(&Base::stuff, std::placeholders::_1, t));
return vals;
}
#include <iostream>
int main() {
for (double v : vstuff(42, {
std::make_shared<Sevens>(),
std::make_shared<Sevens>(),
std::make_shared<Sevens>(),
std::make_shared<Threes>(),
std::make_shared<Sevens>(),
std::make_shared<Threes>(),
std::make_shared<Sevens>(),
std::make_shared<Sevens>(),
std::make_shared<Threes>(),
std::make_shared<Sevens>(),
}))
{
std::cout << v << " ";
}
}
版画
7 7 7 3 7 3 7 7 3 7