On 7/18/2013 4:12 AM, Frédéric Bron wrote:
Thank you all! It works now with the code below. What was the most difficult was to find the headers to include. Frédéric
#include <iostream> #include <string>
#include <boost/fusion/functional/adapter/fused_function_object.hpp> #include <boost/fusion/include/for_each.hpp> #include <boost/fusion/include/sequence.hpp> #include <boost/fusion/include/transform.hpp> #include <boost/fusion/include/vector_tie.hpp> #include <boost/fusion/include/zip_view.hpp> #include <boost/type_traits/remove_reference.hpp>
typedef boost::fusion::vector<double, int, std::string, char> Key;
template<class SeqOfSeqs, class Func> typename boost::fusion::result_of::transform< boost::fusion::zip_view<SeqOfSeqs> const, boost::fusion::fused_function_object<Func const &> >::type n_ary_transform(const SeqOfSeqs &s, const Func &f) { return boost::fusion::transform( boost::fusion::zip_view<SeqOfSeqs>(s), boost::fusion::fused_function_object<const Func&>(f)); }
struct min { template <typename Sig> struct result;
template <class Self, typename T> struct result< Self(T, T) > { typedef typename boost::remove_reference<T>::type type; };
template<typename T> T operator()(const T &lhs, const T &rhs) const { return std::min(lhs, rhs); } };
struct print { template <class T> void operator()(const T &rhs) const { std::cout<<rhs<<'\n'; } };
int main() { Key a(1., 0, "zz", 'a'); Key b(2., -1, "aa", 'a'); Key c; c=n_ary_transform(boost::fusion::vector_tie(a, b), min()); boost::fusion::for_each(c, print()); return 0; }
I'm curious, wouldn't fusion's binary transform algorithm work for you? c = boost::fusion::transform(a, b, min()); Jeff