5

is there any way to make this work? I hope you'll get the idea, I'm trying to create a list by means of recursive pairs

#include <boost/variant.hpp>
#include <utility>

struct nil {};
typedef boost::make_recursive_variant<nil, std::pair<int, boost::recursive_variant_ >>::type list_t;

int main() {
  list_t list = { 1, (list_t){ 2, (list_t){ 3, nil() } } };
  return 0;
}
Voivoid
  • 461
  • 3
  • 11

1 Answers1

4

No. The point of a boost::variant is that it has a fixed size, and does not do dynamic allocation. In this way it's similar to a union. A recursive boost::variant would have to have infinite size in order to contain its largest possible value - clearly impossible.

You could, however, do this by passing it through a pointer. For example:

struct nil { };

typedef boost::make_recursive_variant<nil, 
    std::pair<int, boost::scoped_ptr<boost::recursive_variant_> > >
        variant_list_int;
bdonlan
  • 224,562
  • 31
  • 268
  • 324
  • 9
    Sorry for 'bringing the hate' a bit late, so to speak, but I just ran into this from a related question. There is no need to put pointers in a boost.variant -- the recursive_variant wrapper uses a `boost::shared_ptr` internally, so your 'infinite size' claim is false. The stack-based scheme is not guaranteed and only used if all constructors (for the template parameters) have a nothrow constructor. You can read more about it here: http://www.boost.org/doc/libs/1_46_1/doc/html/variant/design.html#variant.design.never-empty (look for 'temporary heap backup'). – phooji Mar 26 '11 at 15:30