2015-01-12 4 views
0

У меня есть сомнения, его правильная поддержка операторов для разных типов пользовательского класса? Предположим, что мы имеем это:Поддержка различных типов для перегруженных операторов?

template<class T> 
class C { /* Class implemantation */ } 

int main() { 

    C<int> someObject; 
    C<double> otherObject; 

    std::cout << someObject + otherObject; 

} 

Это правильно поддерживать оператор + для объекта C ВЗ типа Int и объект C типа двойной?

+0

Поддерживает ли C оба типа в целом? Существует ли конструктивный способ реализации оператора '+' для обоих типов? – IllusiveBrian

+0

Это зависит от вас. Вы можете заставить его работать автоматически. Вы можете сделать так, чтобы пользователю нужно было сделать static_cast (оператор преобразования). Или вы можете это запретить. Проблема с автоматическим - какой тип должен получить приоритет? –

ответ

2

Независимо от того, является ли оно логически правильным или нет, зависит от того, как вы, разработчик классов, хотите, чтобы ваши классы были использованы. Имеет ли смысл добавить someObject и otherObject? Имеет смысл добавить 2 и 3.5, но это ничего не говорит о том, подходит ли это для вашего кода. В качестве встречного примера вы не можете добавить basic_string<char> и basic_string<wchar> - это дополнение не имеет смысла, так как вы должны хранить символы того же типа, но вы можете может добавить два basic_string<T>, для любых T.

Вы можете, конечно, написать код, чтобы сделать это, но с ?? будет определено.

template <typename T> 
class C { 
    .. 
    template <typename U> 
    C<??> operator+(const C<U>& rhs) { 
     // .. 
    } 
}; 
+0

Спасибо за ваш ответ, это было очень поучительно. В первый момент я думаю, что мне нужно работать только с объектами того же типа и только для операторов того же типа. –

0

Если вы хотите конкретный оператор действовать по специализации вашего класса для определенных типов, вы всегда можете написать специализированную перегрузку оператора, например:

template<class T> 
class C { /* implementation */ }; 

C<double> operator+ (C<int> a, C<double> b) 
{ 
    C<double> ret; 
    // Do something to ret given a and b 
    return ret; 
} 

// Lets make it commutative (is that the right word?) 
C<double> operator+ (C<double> a, C<int> b) 
{ 
    return b + a; 
} 

int main(int argc, char** argv) 
{ 
    C<int> a; 
    C<double> b; 

    C<double> ret1 = a + b; 
    C<double> ret2 = b + a; 

    return 0; 
} 

Это просто зависит от того, какого поведения вы хочу достичь.

+0

Эй! Благодаря! Это очень полезно. Есть какой-то способ достичь вашего успеха без специализации шаблона? –

+0

Возможно, но это зависит от того, что вы хотите сделать. – ilent2

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