dariomt@gmail.com skrev:
Hi list,
I found a small inconvenience while trying to use boost::assign::list_of with the following code
#include <vector> #include
struct A { // no implicit conversion from int explicit A(int i) {}
// constructor from two ints A(int i, int j) {} };
void works_with_two_ints() { std::vector<A> v = boost::assign::list_of<A>(1,2)(3,4)(5,6); }
#if 0 void does_not_work_with_one_int() { std::vector<A> v = boost::assign::list_of<A>(1)(2)(3); } #endif
Looking into the code, it seems as if assign_detail::generic_list<A> had two slightly different versions of operator() generated with some preprocessor magic
// 1) accepts a fully constructed A generic_list& operator()( const A& u ) { this->push_back( u ); return *this; }
// 2) accepts two generic paramenters forwarding them to A's two parameter constructor template
generic_list& operator()(const U& u, const V& v) { this->push_back( A(u,v) ); return *this; } I'm missing another operator() that takes one generic parameter and forwards it to A's one parameter constructor, for the case where it is not implicitly convertible.
// 3) accepts a generic paramenter forwarding it to A's one parameter constructor template <typename U> generic_list& operator()(const U& u) { this->push_back( A(u) ); return *this; }
That saves me from typing A's everywhere
std::vector<A> v = boost::assign::list_of(A(1))(A(2))(A(3));
Does this make sense?
I think it does. Instead of adding a new function, I tried to replace the one argument one. I also tried adding both. It seems to break gcc 4.4 though. Not vc9. So until someone has found a way to make it work on gcc, I'm slightly concerned about adding it. -Thorsten