Должен ли я использовать boost::bind для создания полиморфной функциональности "transform"?

Я пытаюсь вызвать функцию-член для каждого объекта в векторе с указанным параметром, и я бы хотел, чтобы этот вызов был полиморфным. Я полагаю, что функция vstuff, показанная ниже, достигает этого. Но можно ли изменить vstuff для получения вектора> без использования 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, поэтому я задаюсь вопросом, возможно ли это..?

1 ответ

Решение

Ты можешь использовать std::bind тоже (или лямбды)

Жить на Колиру

#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 
Другие вопросы по тегам