boost :: transform (), только если добавляемое значение не равно NULL?

У меня есть следующий код:

// For each trigger model (_1) (which is just a CString), do:
//    m_triggers.push_back(triggers.GetTrigger(static_cast<char const*>(_1)))
boost::transform(
model.Triggers(),
std::back_inserter(m_triggers),
phx::bind(&CTriggerController::GetTrigger, phx::ref(triggers),
phx::static_cast_<char const*>(_1)));

m_triggers это вектор указателей для запуска объектов:

std::vector<CTrigger*> m_triggers;

Если звонок CTriggerController::GetTrigger() возвращает NULL (что означает, что триггер с таким именем не может быть найден), я не хочу выдвигать что-либо на мой m_triggers вектор.

Есть ли простой способ сделать это с помощью небольшой модификации моего кода выше?

Я использую Boost 1.55.0 на MSVC9 (только C ++ 03)

0

Решение

Ты можешь использовать Boost.Range преобразовывать и фильтровать одновременно.

#include <vector>
#include <iostream>

#include <boost/range.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>

int main()
{
int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> out;
using boost::adaptors::filtered;
using boost::adaptors::transformed;
boost::copy(data | transformed([](int x) { return x + 1; })
| filtered([](int x) { return x % 2 == 0; }),
std::back_inserter(out));
for(auto x : out) {
std::cout << x << std::endl;
}

return 0;
}

И то, что должно лучше соответствовать вашему варианту использования:

boost::copy(
model.Triggers() | transformed(phx::bind(&CTriggerController::GetTrigger, phx::ref(triggers),
phx::static_cast_<char const*>(_1)))
| filtered(phx::val(phx::placeholders::_1)),
std::back_inserter(m_triggers)
);
4

Другие решения

Сначала скопируйте во временный контейнер, используя std: remove_copy_if с предикатом, который нужно удалить при GetTrigger() == NULL, а затем преобразовать.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector