Если аргумент функции известен во время компиляции, вы можете использовать диспетчеризацию во время компиляции, например,
template <int N>
constexpr auto function_name()
{
if constexpr(N == 1)
return 2.3;
else if constexpr (N == 2)
return 1;
else
return "string";
}
, которую можно создать и вызвать следующим образом
std::cout << function_name<1>() << "\n";
C ++17 необходим для части if constexpr
.Обратите внимание, что при привязке возвращаемого значения к переменной тщательно выбирайте тип (например, чтобы неявно не преобразовать double
в int
случайно), используйте дедукцию типа или тип variant
, как показано в существующих ответах..
Обратите внимание, что, как указано в комментариях @NathanOliver, существует также решение до C ++ 17, в котором вместо if constexpr
используется *1013*:
template <int N> constexpr auto function_name() { return "string"; }
template <> constexpr auto function_name<1>() { return 2.3; }
template <> constexpr auto function_name<2>() { return 1; }
Использованиеданного шаблона и его специализаций не отличается от вышеуказанных.