У меня есть класс, который инкапсулирует некоторые арифметические вычисления, скажем, вычисления с фиксированной точкой. Мне нравится идея перегрузки арифметических операторов, поэтому я пишу следующее:Перегрузка и неявное преобразование оператора C++
class CFixed
{
CFixed(int );
CFixed(float);
};
CFixed operator* (const CFixed& a, const CFixed& b)
{ ... }
Все работает. Я могу написать 3 * CFixed (0) и CFixed (3) * 10.0f. Но теперь я понимаю, я могу реализовать оператор * с целочисленным операндом гораздо более эффективным. Поэтому я перегружать:
CFixed operator* (const CFixed& a, int b)
{ ... }
CFixed operator* (int a, const CFixed& b)
{ ... }
Он по-прежнему работает, но теперь CFixed (0) * 10.0f вызовы перегруженной версии, преобразования с плавающей точкой в междунар (и я ожидал, что это конвертировать поплавок CFixed). Конечно, я могу перегрузить также и поплавковые версии, но для меня это комбинаторный взрыв кода. Есть ли способ обхода (или я неправильно проектирую свой класс)? Как я могу сказать компилятору вызывать перегруженную версию оператора * ТОЛЬКО с ints?
С другой стороны, конструкторы, принимающие один параметр (и, тем более, встроенный), вероятно, должны быть объявлены явным, что, конечно же, предотвратит продвижение ... но также предотвратит ошибки. –
Другой «явный» защитник =) Неявные конструкторы полезны, если вы понимаете, что они делают. Замечательно создавать функцию, принимать CFixed аргумент и передавать целые числа! – SadSido
Я не верю, что вы можете. – atomice