#include <boost/variant.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <vector>
void a(int, int)
{}
void b()
{}
int main(int argc, char **argv)
{
typedef boost::variant<boost::function0<void>, boost::function2<void, int, int> > v;
std::vector<v> c;
c.push_back(boost::bind(&a, _1, _2));
c.push_back(boost::bind(&b));
boost::function2<void, int, int> function = boost::get<boost::function2<void, int, int> >(c[0]);
function(4, 5);
}
CiAgICAjaW5jbHVkZSA8Ym9vc3QvdmFyaWFudC5ocHA+CiAgICAjaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CiAgICAjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgogICAgCiAgICAjaW5jbHVkZSA8dmVjdG9yPgogICAgCiAgICB2b2lkIGEoaW50LCBpbnQpCiAgICB7fQogICAgCiAgICAKICAgIHZvaWQgYigpCiAgICB7fQogICAgCiAgICAKICAgIGludAltYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKICAgIHsKICAgIAl0eXBlZGVmIGJvb3N0Ojp2YXJpYW50PGJvb3N0OjpmdW5jdGlvbjA8dm9pZD4sIGJvb3N0OjpmdW5jdGlvbjI8dm9pZCwgaW50LCBpbnQ+ID4gdjsKICAgIAogICAgCXN0ZDo6dmVjdG9yPHY+IGM7CiAgICAKICAgIAljLnB1c2hfYmFjayhib29zdDo6YmluZCgmYSwgXzEsIF8yKSk7CiAgICAJYy5wdXNoX2JhY2soYm9vc3Q6OmJpbmQoJmIpKTsKICAgIAogICAgCWJvb3N0OjpmdW5jdGlvbjI8dm9pZCwgaW50LCBpbnQ+IGZ1bmN0aW9uID0gYm9vc3Q6OmdldDxib29zdDo6ZnVuY3Rpb24yPHZvaWQsIGludCwgaW50PiA+KGNbMF0pOwogICAgCiAgICAJZnVuY3Rpb24oNCwgNSk7CiAgICB9
In file included from /usr/include/boost/variant.hpp:17:0,
from prog.cpp:2:
/usr/include/boost/variant/variant.hpp: In instantiation of 'void boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::convert_construct(T&, int, mpl_::false_) [with T = const boost::_bi::bind_t<void, void (*)(int, int), boost::_bi::list2<boost::arg<1>, boost::arg<2> > >; T0_ = boost::function0<void>; T1 = boost::function2<void, int, int>; T2 = boost::detail::variant::void_; T3 = boost::detail::variant::void_; T4 = boost::detail::variant::void_; T5 = boost::detail::variant::void_; T6 = boost::detail::variant::void_; T7 = boost::detail::variant::void_; T8 = boost::detail::variant::void_; T9 = boost::detail::variant::void_; T10 = boost::detail::variant::void_; T11 = boost::detail::variant::void_; T12 = boost::detail::variant::void_; T13 = boost::detail::variant::void_; T14 = boost::detail::variant::void_; T15 = boost::detail::variant::void_; T16 = boost::detail::variant::void_; T17 = boost::detail::variant::void_; T18 = boost::detail::variant::void_; T19 = boost::detail::variant::void_; mpl_::false_ = mpl_::bool_<false>]':
/usr/include/boost/variant/variant.hpp:1740:38: required from 'boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::variant(const T&) [with T = boost::_bi::bind_t<void, void (*)(int, int), boost::_bi::list2<boost::arg<1>, boost::arg<2> > >; T0_ = boost::function0<void>; T1 = boost::function2<void, int, int>; T2 = boost::detail::variant::void_; T3 = boost::detail::variant::void_; T4 = boost::detail::variant::void_; T5 = boost::detail::variant::void_; T6 = boost::detail::variant::void_; T7 = boost::detail::variant::void_; T8 = boost::detail::variant::void_; T9 = boost::detail::variant::void_; T10 = boost::detail::variant::void_; T11 = boost::detail::variant::void_; T12 = boost::detail::variant::void_; T13 = boost::detail::variant::void_; T14 = boost::detail::variant::void_; T15 = boost::detail::variant::void_; T16 = boost::detail::variant::void_; T17 = boost::detail::variant::void_; T18 = boost::detail::variant::void_; T19 = boost::detail::variant::void_]'
prog.cpp:22:41: required from here
/usr/include/boost/variant/variant.hpp:1594:17: error: call of overloaded 'initialize(void*, const boost::_bi::bind_t<void, void (*)(int, int), boost::_bi::list2<boost::arg<1>, boost::arg<2> > >&)' is ambiguous
)
^
/usr/include/boost/variant/variant.hpp:1594:17: note: candidates are:
In file included from /usr/include/boost/variant/variant.hpp:33:0,
from /usr/include/boost/variant.hpp:17,
from prog.cpp:2:
/usr/include/boost/variant/detail/initializer.hpp:104:24: note: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list2<boost::function0<void>, boost::function2<void, int, int> > > >::initializer_node, mpl_::int_<1> >; Iterator = boost::mpl::l_iter<boost::mpl::list1<boost::function2<void, int, int> > >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const boost::function2<void, int, int>&]
static int initialize(void* dest, param_T operand)
^
/usr/include/boost/variant/detail/initializer.hpp:104:24: note: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >; Iterator = boost::mpl::l_iter<boost::mpl::list2<boost::function0<void>, boost::function2<void, int, int> > >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const boost::function0<void>&]
In file included from /usr/include/boost/variant.hpp:17:0,
from prog.cpp:2:
/usr/include/boost/variant/variant.hpp: In instantiation of 'void boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::convert_construct(T&, int, mpl_::false_) [with T = const boost::_bi::bind_t<void, void (*)(), boost::_bi::list0>; T0_ = boost::function0<void>; T1 = boost::function2<void, int, int>; T2 = boost::detail::variant::void_; T3 = boost::detail::variant::void_; T4 = boost::detail::variant::void_; T5 = boost::detail::variant::void_; T6 = boost::detail::variant::void_; T7 = boost::detail::variant::void_; T8 = boost::detail::variant::void_; T9 = boost::detail::variant::void_; T10 = boost::detail::variant::void_; T11 = boost::detail::variant::void_; T12 = boost::detail::variant::void_; T13 = boost::detail::variant::void_; T14 = boost::detail::variant::void_; T15 = boost::detail::variant::void_; T16 = boost::detail::variant::void_; T17 = boost::detail::variant::void_; T18 = boost::detail::variant::void_; T19 = boost::detail::variant::void_; mpl_::false_ = mpl_::bool_<false>]':
/usr/include/boost/variant/variant.hpp:1740:38: required from 'boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::variant(const T&) [with T = boost::_bi::bind_t<void, void (*)(), boost::_bi::list0>; T0_ = boost::function0<void>; T1 = boost::function2<void, int, int>; T2 = boost::detail::variant::void_; T3 = boost::detail::variant::void_; T4 = boost::detail::variant::void_; T5 = boost::detail::variant::void_; T6 = boost::detail::variant::void_; T7 = boost::detail::variant::void_; T8 = boost::detail::variant::void_; T9 = boost::detail::variant::void_; T10 = boost::detail::variant::void_; T11 = boost::detail::variant::void_; T12 = boost::detail::variant::void_; T13 = boost::detail::variant::void_; T14 = boost::detail::variant::void_; T15 = boost::detail::variant::void_; T16 = boost::detail::variant::void_; T17 = boost::detail::variant::void_; T18 = boost::detail::variant::void_; T19 = boost::detail::variant::void_]'
prog.cpp:23:33: required from here
/usr/include/boost/variant/variant.hpp:1594:17: error: call of overloaded 'initialize(void*, const boost::_bi::bind_t<void, void (*)(), boost::_bi::list0>&)' is ambiguous
)
^
/usr/include/boost/variant/variant.hpp:1594:17: note: candidates are:
In file included from /usr/include/boost/variant/variant.hpp:33:0,
from /usr/include/boost/variant.hpp:17,
from prog.cpp:2:
/usr/include/boost/variant/detail/initializer.hpp:104:24: note: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list2<boost::function0<void>, boost::function2<void, int, int> > > >::initializer_node, mpl_::int_<1> >; Iterator = boost::mpl::l_iter<boost::mpl::list1<boost::function2<void, int, int> > >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const boost::function2<void, int, int>&]
static int initialize(void* dest, param_T operand)
^
/usr/include/boost/variant/detail/initializer.hpp:104:24: note: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >; Iterator = boost::mpl::l_iter<boost::mpl::list2<boost::function0<void>, boost::function2<void, int, int> > >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const boost::function0<void>&]