У меня есть обходной путь в коде ниже, но это довольно многословно.Есть ли лучший способ?
Работая с C ++ 17, вы можете использовать if constexpr
, и мне кажется, это хорошее решение.
Если вы действительно хотите что-то другое,Я предлагаю способ, основанный на полной специализации шаблонной функции (смесь решений Evg и Slava)
Я имею в виду что-то как
#include <iostream>
#include <string>
template <bool>
constexpr auto get_value ()
{ return 47; }
template <>
constexpr auto get_value<true> ()
{ return std::string_view{"47"}; }
int main()
{
constexpr auto use_str = false;
constexpr auto val = get_value<use_str>();
std::cout << val << std::endl;
}
Как указывал Slava, шаблонная функция со значением по умолчаниюверсия и явная специализация для одного случая могут быть менее читабельными.
Таким образом, если вы предпочитаете вариант, более подробный, но более читабельный, вы можете написать две явные специализации для get_value()
следующим образом
template <bool>
constexpr auto get_value ();
template <>
constexpr auto get_value<false> ()
{ return 47; }
template <>
constexpr auto get_value<true> ()
{ return std::string_view{"47"}; }