Во-первых, обратите внимание, что ваша программа пишет «Foo, Foo, Foo, Foo, Foo, Foo ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, "" к вашей строке результата - как уже упоминалось в комментариях, вы хотели использовать back_inserter там.
Что касается ответа, когда естьединственное значение, полученное из диапазона, я смотрю на std::accumulate
(так как - это версия C ++ сворачивания / уменьшения)
#include <string>
#include <iostream>
#include <numeric>
#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/bind.hpp>
std::string dostuff(const std::string& a) {
return std::string("Foo");
}
int main() {
std::string s("a,b,c,d,e,f");
std::string result =
accumulate(
++boost::make_token_iterator<std::string>(s.begin(), s.end(), boost::char_separator<char>(",")),
boost::make_token_iterator<std::string>(s.end(), s.end(), boost::char_separator<char>(",")),
dostuff(*boost::make_token_iterator<std::string>(s.begin(), s.end(), boost::char_separator<char>(","))),
boost::bind(std::plus<std::string>(), _1,
bind(std::plus<std::string>(), ",",
bind(dostuff, _2)))); // or lambda, for slightly better readability
std::cout << result << '\n';
}
За исключением того, что теперь way поверх и повторяет make_token_iterator дважды.Я предполагаю, что boost.range выигрывает.