Шаблон перегрузки оператора преобразования типа
Скорее всего глупость спрошу (начинающий, увы), но в гугле ничего не смог найти.
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 шт):
Попробуйте так:
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&, или вместо оператора конверсии использовать функцию.