Я пытаюсь связать boost::adaptors::transformed
(пусть его называют map
) на boost::adaptors::filtered
(пусть назовет его filter
) - идея состоит в том, чтобы сопоставить fun
, который возвращает "Maybe" (в моем случае a std::pair<bool, T>
) по диапазону и выводить только часть результатов. Моя первая реализация:
define BOOST_RESULT_OF_USE_DECLTYPE // enable lambda arguments for Boost.Range
#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/adaptor/transformed.hpp>
struct OnlyEven
{
typedef int argument_type;
typedef std::pair<bool, int> result_type;
result_type operator()(argument_type x) const
{
std::cout << "fun: " << x << std::endl;
return std::make_pair(x % 2 == 0, x);
}
} only_even;
int main(int argc, char* argv[])
{
auto map = boost::adaptors::transformed;
auto filter = boost::adaptors::filtered;
int v[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto s = v | map(only_even) | filter([](std::pair<bool, int> x)->bool{ return x.first; });
for (auto i : s) {}
return 0;
}
Когда я запускаю это, я получаю:
fun: 1
fun: 2
fun: 2
fun: 3
fun: 4
fun: 4
fun: 5
fun: 6
fun: 6
fun: 7
fun: 8
fun: 8
fun: 9
fun: 10
fun: 10
Каждый раз, когда predicate
true
, fun
вызывается дважды. Это ожидаемое поведение? Я делаю что-то неправильно или это/был ошибкой в Boost (я использую 1.48)?
Изменить. Я пробовал это в версии расширения Boost и все еще происходит.