Поскольку отсутствует transform_if, правильный способ сделать это состоит в том, чтобы сначала скопировать, если пути, имеющие ненулевую длину, get_pertinent_part, в другой контейнер, а затем запустить преобразование в этом новом контейнере.
В качестве альтернативы вы можете написать что-то вроде transform_if, в котором результат вашей функции преобразования сравнивается с предикатом.Вот мой непроверенный снимок:
template <class InIt, class OutIt, class UnaryFunction, class Predicate>
void transform_if_value(InIt first, InIt last, OutIt out, UnaryFunction fn, Predicate pred)
{
for ( ; first != last; ++ first)
{
auto val = fn(*first);
if (pred(val))
*out++ = val;
}
}
Тогда вы могли бы использовать это как
transform_if_value(
demo_set.begin(),
demo_set.end(),
std::inserter(output, output.begin()),
get_pertinent_part("bin/obj/Debug/"),
[](const std::string& s) {return !s.empty();});
Для еще более холодного синтаксиса, проверьте адаптеры диапазона Boost:
boost::copy(
demo_set | boost::adaptors::transformed(get_pertinent_part("bin/obj/Debug/"))
| boost::adaptors::filtered([](const std::string& s) {return !s.empty();}),
std::inserter(output, output.begin()));