Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is boost::variant rocket science? (And should I therefore avoid it for simple problems?)

Tags:

c++

boost

OK, so I have this tiny little corner of my code where I'd like my function return either of (int, double, CString) to clean up the code a bit.

So I think: No problem to write a little union-like wrapper struct with three members etc. But wait! Haven't I read of boost::variant? Wouldn't this be exactly what I need? This would save me from messing around with a wrapper struct myself! (Note that I already have the boost library available in my project.)

So I fire up my browser, navigate to Chapter 28. Boost.Variant and lo and behold:

The variant class template is a safe, generic, stack-based discriminated union container, offering a simple solution for manipulating an object from a heterogeneous set of types [...]

Great! Exactly what I need!

But then it goes on:

Boost.Variant vs. Boost.Any

  • Boost.Any makes little use of template metaprogramming techniques (avoiding potentially hard-to-read error messages and significant compile-time processor and memory demands).

[...]

Troubleshooting

"Internal heap limit reached" -- Microsoft Visual C++ -- The compiler option /ZmNNN can increase the memory allocation limit. The NNN is a scaling percentage (i.e., 100 denotes the default limit). (Try /Zm200.)

[...]

Uh oh. So using boost::variant may significantly increase compile-time and generate hard-to-read error messages. What if someone moves my use of boost::variant to a common header, will our project suddenly take lots longer to compile? Am I introducing an (unnecessarily) complex type?

Should I use boost::variant for my simple tiny problem?

like image 847
Martin Ba Avatar asked Dec 12 '22 18:12

Martin Ba


2 Answers

Generally, use boost::variant if you do want a discriminated union (any is for unknown types -- think of it as some kind of equivalent to how void* is used in C).

Some advantages include exception handling, potential usage of less space than the sum of the type sizes, type discriminated "visiting". Basically, stuff you'd want to perform on the discriminated union.

However, for boost::variant to be efficient, at least one of the types used must be "easily" constructed (read the documentation for more details on what "easily" means).

like image 75
lijie Avatar answered Dec 15 '22 08:12

lijie


Boost.variant is not that complex, IMHO. Yes, it is template based, but it doesn't use any really complex feature of C++. I've used quite a bit and no problem at all. I think in your case it would help better describing what your code is doing.

Another way of thinking is transforming what that function returns into a more semantically rich structure/class that allows interpreting which inner element is interesting, but that depends on your design.

like image 32
Diego Sevilla Avatar answered Dec 15 '22 08:12

Diego Sevilla