Шаблон перегрузки оператора преобразования типа

Скорее всего глупость спрошу (начинающий, увы), но в гугле ничего не смог найти.

p_Bool - свойство класса типа «bool»

p_String - свойство класса типа «std::string»

template <typename T>
operator T()
{
    if (std::is_same<T, bool>::value)
        return p_Bool;
            if (std::is_same<T, std::string>::value)
        return p_String;
}

Компилятор ругается, что не может преобразовать «p_String» в «T» (в коде пытаюсь получить из класса значение типа bool) Явное преобразование типа конечно можно, но типов может быть не два, а двадцать. На каждый из двадцати типов писать оператора преобразования достаточно долго. Так вообще можно сделать?


Ответы (1 шт):

Автор решения: VladD

Попробуйте так:

if constexpr (std::is_same<T, bool>::value)
    return p_Bool;
if constexpr (std::is_same<T, std::string>::value)
    return p_String;

При этом выбор типа будет проводиться во время компиляции, и если ваш тип — bool, то код return p_String; как бы не будет рассматриваться компилятором.

Проверка: https://ideone.com/koqMfm

Обратите внимание, что код static_cast<std::string>(instance) компилироваться не будет по причинам, изложенным тут, нужно либо использовать std::string const&, или вместо оператора конверсии использовать функцию.

→ Ссылка