2016-02-24 2 views
3

Имея эту функцию:Выведите тип члена аргументов шаблона объекта

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

Синтаксис 'std :: declval .x' может использоваться только с объектом, а не с типом. –

+0

@RSahu: Правильно. Я этого не заметил. Благодарю. Возможно ли каким-либо образом узнать тип элемента переданного объекта во время компиляции? – sjaustirni

+0

Я пытался использовать 'std :: is_arithmetic :: value', он компилируется, но, похоже, он не работает. – sjaustirni

ответ

3

Я считаю, что на самом деле вы не хотите, чтобы они выполняли арифметику. Вы хотите, чтобы критические выражения в теле шаблона функции были хорошо сформированы. В этом случае, пойти на что-то вдоль линий

template <typename T> 
auto operator-(const T& vector) 
    -> decltype(void(x - vector.x), void(y - vector.y), vector) 
{/* ... */} 

Если вы не хотите придерживаться правильной версии кода, подставляя decltype(std::declval<T>().x) или decltype(T::x) для std::declval<T>.x (Ditto для 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) 
{} 
+0

Я действительно хочу, чтобы они были арифметическими. Мне нужно отрицать их ценности. Это не имеет смысла, если они не являются арифметическими. Или я чего-то не хватает? – sjaustirni

+0

@ Данди: сложные/рациональные числа не являются * арифметическими *, но отрицать их имеет смысл. – Jarod42

+0

@Dundee Унарный оператор '-' может быть перегружен. – Columbo

Смежные вопросы