Итак, я недавно экспериментировал с некоторыми шаблонами, и это был код, на который я наткнулся:
template <typename T>
int someFunction(T someParameter)
{
return std::is_same<T, bool>::value ? 1 : 0 +
std::is_same<T, char>::value ? 2 : 0 +
std::is_same<T, int>::value ? 3 : 0;
}
Так что, по сути, это набор условных операторов, которые возвращают значение, если оно истинно, или вообще ничего если ложь. И если вы сложите их вместе, вы можете определить, какой тип данных является аргументом.
Однако я кое-что понял. Имеют ли значение скобки? Я попытался заключить код в скобки, например:
template <typename T>
int someFunction(T someParameter)
{
return (std::is_same<T, bool>::value ? 1 : 0) +
(std::is_same<T, char>::value ? 2 : 0) +
(std::is_same<T, int>::value ? 3 : 0);
}
Но результат остался прежним. Итак, я подумал, может быть, компилятор увидит что-то вроде этого:
template <typename T>
int someFunction(T someParameter)
{
return std::is_same<T, bool>::value ? 1 : (0 +
std::is_same<T, char>::value ? 2 : (0 +
std::is_same<T, int>::value ? 3 : 0));
}
Таким образом, он в некотором смысле сначала оценивает последний условный оператор и работает в обратном направлении. Но я все еще не могу осмыслить эту штуку, и я не уверен, правильно ли я это понимаю.
Может ли кто-нибудь сказать мне, какой здесь приоритет оператора и как он выполняется? Спасибо.