Hi list,

I found a small inconvenience while trying to use boost::assign::list_of with the following code

#include <vector>
#include <boost/assign/list_of.hpp>

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 <typename U, typename V>
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?

Thanks!