13

This compiles:

std::vector<int> value = boost::assign::list_of(1)(2);

But not this:

Constructor(std::vector<int> value)
{
}

Constructor (boost::assign::list_of(1)(2));

Is there a one-liner solution for initializing the vector passed to the constructor?

Better still, if the constructor copies to a class variable by taking a reference instead:

Constructor(std::vector<int>& value)
{
    _value = value;
}

UPDATE

If I try the following:

enum Foo
{
    FOO_ONE, FOO_TWO 
};

class Constructor
{
public:
    Constructor(const std::vector<Foo>& value){}
};

Constructor c(std::vector<Foo>(boost::assign::list_of(FOO_ONE)));

I get the compiler error:

error C2440: '<function-style-cast>' : cannot convert from 'boost::assign_detail::generic_list<T>' to 'std::vector<_Ty>'
1>          with
1>          [
1>              T=Foo
1>          ]
1>          and
1>          [
1>              _Ty=Foo
1>          ]
1>          No constructor could take the source type, or constructor overload resolution was ambiguous
Baz
  • 12,713
  • 38
  • 145
  • 268

2 Answers2

20

This is a annoying problem, we also had some time before. We fixed it by using the convert_to_container method:

Constructor c(boost::assign::list_of(1)(2).convert_to_container<std::vector<int> >() );

There are more issues with std::list using in constructor too. See Pass std::list to constructor using boost's list_of doesn't compile for the appropriate answer.

Community
  • 1
  • 1
Sven
  • 710
  • 9
  • 18
0

I'm using this template to make temporary instance of std::vector in-place:

#include <vector>
namespace Util {
//init vector
template <typename ELEMENT_TYPE > struct vector_of
    : public std::vector<ELEMENT_TYPE>
{
    vector_of(const ELEMENT_TYPE& t)
    {
        (*this)(t);
    }
    vector_of& operator()(const ELEMENT_TYPE& t)
    {
        this->push_back(t);
        return *this;
    }
};
}//namespace Util

Usage would look like this:

Constructor (Util::vector_of<int>(1)(2));

Constructor signature would look like this:

Constructor(const std::vector<int>& value)
{
    _value = value;
}