Обе ветви if
должны быть действительны во время компиляции, даже если одна из них никогда не выполняется.
Если у вас есть доступ к C ++ 17, измените if
s наif constexpr
:
template<typename T>
T foo() {
if constexpr (std::is_same<T, int>::value)
return 5;
if constexpr (std::is_same<T, std::string>::value)
return std::string("bar");
throw std::exception();
}
До C ++ 17 вам придется эмулировать это с помощью специализации шаблона:
template<typename T>
T foo()
{
throw std::exception();
}
template <>
int foo<int>() {
return 5;
}
template <>
std::string foo<std::string>() {
return "bar";
}
Если ваш реальный foo
выполняет больше работы, чем этотНапример, если его специализация приведет к дублированию кода, вы можете ввести вспомогательную функцию, которая будет инкапсулировать только операторы return
/ throw
, и специализировать ее.