c++boostconstexprboost-hana

How to store boost::hana::map inside a class?


I want to store boost::hana::map inside a class so that I can write code like this inside the class:

if constexpr (boost::hana::contains(map_, "name"_s)){
    std::cout << map_["name"_s] << std::endl;
}

But I am getting an error:

note: implicit use of 'this' pointer is only allowed within the evaluation of a call to a 'constexpr' member function

With this->map_:

note: use of 'this' pointer is only allowed within the evaluation of a call to a 'constexpr' member function

The most interesting thing is if I write like this:

if (boost::hana::contains(map_, "name"_s)){
    std::cout << map_["name"_s] << std::endl;
}

I get an error that there is no such field (it really may not exist, that's why there was an if constexpr).

And yet, it works like this(WHY?!):

auto map = map_;
if constexpr (boost::hana::contains(map, "name"_s)){
    std::cout << map["name"_s] << std::endl;
}

I absolutely don't understand how it works. How is boost::hana::map supposed to be used in this case?

Full example

Stupid workaround


Solution

  • Yes, using this here appears to be right out.

    Since the information you are trying to access should be accessible at compile-time, one simple workaround would be to use the type of the entire expression.

    void print_name()
    {
        if constexpr (decltype(boost::hana::contains(map, "name"_s)){})
        {
            Print(map["name"_s]);
        }
    }
    

    Note that hana::contains returns an object derived from std::integral_constant so the contained value is static constexpr, and it implicitly converts to bool.