#include <boost/range/numeric.hpp>
#include <boost/function_output_iterator.hpp>
#include <iostream>
#include <string>
#include <vector>

template <class Container>
struct ignore_insert {
    // Ignore any insertions that don't match container's type
    Container& cont;
    ignore_insert(Container& c) : cont(c) {}
    void operator() (typename Container::value_type i) {
        cont.push_back(i);
    }
    template <typename T>
    void operator() (T) {}
};

template <class Container>
auto ignoreinsrtr(Container& cont) {
    return boost::make_function_output_iterator(ignore_insert<Container>{cont});
}

int main() {
    std::vector<int> v { 0, 1, 2, 3 }; // any generic STL container
    std::vector<std::string> result;
    boost::adjacent_difference(v, ignoreinsrtr(result),
            [](int a, int b){ return std::to_string(a+b); });
    for (auto i : result)
        std::cout << i << ", ";
    std::cout << '\n';
    return 0;
}

