Search code examples
c++type-conversionc++17implicit-conversionvariant

Prefer std::string in std::variant<bool, std::string> for const char *


Consider the following code -

#include <variant>
#include <string>

int p(std::variant<bool, std::string> v) {
    return v.index();
}

int main() {
    return p("ad");
}

instead of choosing std::string, p will be instantiated with variant containing bool (I want std::string), well this can be fixed using explicitly specifying std::string but that is too much work 😊, I tried providing different overloads but it doesn't seem to work.


Solution

  • Such code:

    #include <variant>
    #include <string>
    
    int p(std::variant<bool, std::string> v) {
        return v.index();
    }
    
    template<size_t N>
    int p(const char (&s)[N]) {
        return p(std::string(s));
    }
    
    int main() {
        return p("ad");
    }
    

    returns 1.