#include <string>

class C
{
    std::string p_String = "";
    bool p_Bool = false;
    int p_Int = 0;
public:
    template <typename T>
    operator T() const
    {
        if constexpr (std::is_same<T, bool>::value)
            return p_Bool;
        if constexpr (std::is_same<T, std::string>::value)
            return p_String;
        if constexpr (std::is_same<T, int>::value)
            return p_Int;
    }
};

int main()
{
    C instance;
    bool b = static_cast<bool>(instance);
    int i = static_cast<int>(instance);
    std::string s = static_cast<std::string const&>(instance);
    //std::string s = static_cast<std::string>(instance);
}
