Ах, проблема операторов ...
Boost создал хорошую библиотеку, так что, предоставляя минимум логики, все остальные варианты автоматически добавляются для вас!
Взгляните на Boost.Operators !
Теперь для вашей проблемы, на самом деле, как вы заметили, вам придется определять оба вида операторов (int и double), а не использовать общий шаблон. Если в этих операторах много логики (в чем я сомневаюсь), вы всегда можете заставить их вызывать общий (шаблонный) метод.
template <typename T>
Complex complex_mult_impl(T const& lhs, Complex const& rhs) { ... } // Note (1)
// return type is not 'Complex const', see (2)
Complex operator*(int lhs, Complex const& rhs)
{
return complex_mult_impl(lhs,rhs);
}
Но если вы используете Boost.operators, вы предоставляете только Complex :: operator * = (int) и Complex :: operator * = (double), и автономные версии будут автоматически выводиться:)
(1) Вы можете использовать здесь by-value, если все аргументы являются встроенными. Вы также можете рассмотреть Boost.CallTraits , который автоматически выбирает между побочным значением и побочным значением в зависимости от того, является ли аргумент встроенным или нет. Это удобно для шаблонов.
(2) При возврате аргументов по значению бессмысленно квалифицировать их как const
. Ключевое слово const
означает только что-то для ссылок и указателей, здесь ничто не мешает пользователю создать «простой» Complex
... и вам повезло, что это не так!