2017-02-03 8 views
0

У меня есть следующая проблема/вопрос: Предположим, что у меня есть класс шаблонов Пара, у которых есть два атрибута x и y типа xobject. я могу легко определить сумму между парой одного и того же класса просто определяющий элемент суммы по элементу, если она определена сумма объекта шаблона, то есть:Специализация операторов внутри класса шаблона между объектами различной специализации этого класса

Couple operator+(Couple in) 
{ 
return Couple((*this).x+in.x,(*this).y+in.y); 
} 

С этой реализации я могу вычислить сумму между Couple<int> элемент. Я не совсем понимаю, как я могу определить сумму между Couple<int> и Couple<something> внутри этого класса. Проблема заключается в том, что я не могу специализироваться сумму внутри класса между классами, которые еще не реализованы, то есть, я не могу писать

Couple<'int'> Couple<'int'>::operator+(Couple<'something'>) 

внутри класса пара.
Вы знаете, как это сделать?
Моя первая идея состояла в том, чтобы использовать второй параметр шаблона внутри оператора, но результаты были не очень хорошими, так как я допускаю только одну сумму стиха, а не в обоих стихах.
Надеюсь, что я объяснил проблему достойным образом.

+0

Вам действительно нужны специализации? Обычно вы должны использовать что-то вроде 'template struct foo {template foo operator + (foo rhs) {stuff}};' – NathanOliver

+0

Если вы хотите применить преобразования типов по всем параметрам (включая те, на которые указывает 'this') к функции функция должна быть, по крайней мере, нечленой функцией (может даже функция друга). – SebNag

+0

Двойной шаблон не должен работать, так как сумма пары и пара отличается от суммы. Пара и пара (она отличается для вывода, и я не хочу использовать C++ 14). – Nicola

ответ

2

Вы можете использовать функцию в friend шаблона:

template <typename T> 
class Couple 
{ 
private: 
    T x, y; 

public: 
    Couple(T xx, T xy) : x{xx}, y{xy} { } 

    template <typename T0, typename T1> 
    friend Couple<std::common_type_t<T0, T1>> 
    operator+(const Couple<T0>& x0, const Couple<T1>& x1); 
}; 

template <typename T0, typename T1> 
Couple<std::common_type_t<T0, T1>> 
operator+(const Couple<T0>& x0, const Couple<T1>& x1) 
{ 
    return {x0.x + x1.x, x0.y + x1.y}; 
} 

Я использую std::common_type_t вычислить тип, который подходит для T0 + T1 добавления.

coliru example


Вам не нужно friend, если вы подвергаете добытчик для x и y как SebTu упомянутого в комментариях.

+0

Учтите, что функция friend необходима только в том случае, если для этого требуется доступ к частным данным. В противном случае достаточно одной функции, отличной от члена. 'y' и' x' должны быть инкапсулированы в функции 'getter()'. – SebNag

+0

Я не хочу использовать C++ 14 – Nicola

+0

@Nicola: почему бы и нет? Код легко адаптируется к C++ 11. Независимо от того, вы должны были упомянуть об этом в вопросе –