
Christopher Schmidt wrote:
Fusion uses boost::result_of to determine the return type of a call expression. Therefore you just need to define a result-metafunction. Thanks. It works. However two things bother me.
First there's the warning : 1>c:\program files\boost\boost_1_39\boost\fusion\view\transform_view\detail\deref_impl.hpp(42) : warning C4172: returning address of local variable or temporary 1> c:\program files\boost\boost_1_39\boost\fusion\view\transform_view\detail\deref_impl.hpp(41) : while compiling class template member function 'const int &boost::fusion::extension::deref_impl<boost::fusion::transform_view_iterator_tag>::apply<Iterator>::call(const Iterator &)' 1> with 1> [ 1> Iterator=boost::fusion::transform_view_iterator<boost::fusion::vector_iterator<const boost::fusion::vector<int,int,double,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_>,0>,triple2> 1> ] 1> c:\program files\boost\boost_1_39\boost\fusion\iterator\deref.hpp(53) : see reference to class template instantiation 'boost::fusion::extension::deref_impl<boost::fusion::transform_view_iterator_tag>::apply<Iterator>' being compiled 1> with 1> [ 1> Iterator=boost::fusion::transform_view_iterator<boost::fusion::vector_iterator<const boost::fusion::vector<int,int,double,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_>,0>,triple2> 1> ] etc etc etc Also, I see that transform returns a view. I need a proper vector that is distinct from the input vector. Here's a bit of context. I am building a recipient for one row in a database query. I have a vector of Exprs, one for each column in the select. Expr has a type member. I want to make a vector with an element for each Expr, initialized to the type's default value (as per type()). I.e. something like this : struct f { /* ... */ template<typename Expr> operator ()(Expr) { return typename Expr::type(); } typedef result_of::transform<SelectList, f>::type row_type; row_type row; transform(select.exprs, row); // type of select.exprs is SelectList std::deque<row_type> results; while (data) { for_each(row, read_fun(...)); results.push_back(row); } Alas row_type is going to be a view :-/ J-L J-L