Имея эту функцию:
template <typename T>
T operator-(const T vector)
{}
Я хочу обеспечить, чтобы у T были члены x
и y
, и что они являются арифметическими. Я пытался сделать это через std::declval<T>
:
template <typename T,
typename = typename
std::enable_if<std::is_arithmetic<std::declval<T>.x>::value>::type,
typename = typename
std::enable_if<std::is_arithmetic<std::declval<T>.y>::value>::type>
T operator-(const T vector)
{}
Но все, что я получаю, это то, что тип не может быть выведен: error: insufficient contextual information to determine type
. Можно ли вообще определить тип члена объекта параметра шаблона?
1 ответ
Я так понимаю, вы на самом деле не хотите, чтобы они были арифметическими. Вы хотите, чтобы ключевые выражения в теле шаблона функции были правильно сформированы. В этом случае сделайте что-нибудь вроде
template <typename T>
auto operator-(const T& vector)
-> decltype(void(x - vector.x), void(y - vector.y), vector)
{/* ... */}
Если вы предпочитаете использовать правильную версию кода, достаточно заменить std::declval<T>.x
std::declval<T>.x
на decltype(std::declval<T>().x)
или decltype(T::x)
(то же самое для y
):
template <typename T,
typename = std::enable_if_t<std::is_arithmetic<decltype(T::x)>{}>,
typename = std::enable_if_t<std::is_arithmetic<decltype(T::x)>{}>>
T operator-(const T vector)
{}
-
может быть перегружен.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
std::declval<T>.x
можно использовать только с объектом, но не с типом.std::is_arithmetic<typename T::x>::value
, он компилируется, но, похоже, не работает.decltype(std::declval<T>().x)
илиdecltype(T::x)
.