Does Boost Variant provides a similar function as std's holds_alternative?

Although not exactly the same, you can use the pointer based get function:

boost::variant<int, std::string> v = "abc";

std::cout << std::boolalpha
          << "variant holds int? "
          << (boost::get<int>(&v) != nullptr) << '\n'
          << "variant holds string? "
          << (boost::get<std::string>(&v) != nullptr) << '\n';

No but, you can use the type() method:

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

int main()
{
    boost::variant<int, std::string> v = "abc";
    std::cout << std::boolalpha
              << "variant holds int? "
              << (v.type() == typeid(int)) << '\n'
              << "variant holds string? "
              << (v.type() == typeid(std::string)) << '\n';
}

But it will not protect you against having the same type twice (boost::variant<int, int, std::string>) as std::holds_alternative would do.


You can create a simple wrapper that will work just like the standard one. Use the fact that boost::get has multiple overloads and when passed a pointer, it will also return a (possibly null) pointer.

template <typename T, typename... Ts>
bool holds_alternative(const boost::variant<Ts...>& v) noexcept
{
    return boost::get<T>(&v) != nullptr;
}

It will be also picked up by ADL, so it doesn't matter much where you put it.

Tags:

C++

Boost