Здравствуйте, _Dreamer, Вы писали:
_D>мало знаю boost, там по моему есть что то наподобие этого моего enable ? если есть, напомните пожалуйста, как его там зовут
::boost::mpl::if_c.
Еще с точки зрения исходного вопроса может показаться интересной boost.type_traits.integral_promotion. Лично мне бы хотелось там увидеть еще arithmetic_conversions, не такая уж редкая задача, а решается просто и переносимо.
Здравствуйте, Lexaux, Вы писали:
L>Мной была избрана следующая тактика — поскольку действия над комплексными числами являются наиболе общими, то класс Complex становится базовым.
Здравствуйте, други.
Возникла проблема следующего характера:
при реализации иерархии числовых множеств (Коплексные-Действительный-Целые числа) необходимо было выполнять арифметические действия так, чтобы результат имел тип большего из аргументов.
Мной была избрана следующая тактика — поскольку действия над комплексными числами являются наиболе общими, то класс Complex становится базовым.
От него наследуют "сужающие" множества.
Перегруженные операторы присутствуют во всех классах только для своего уровня, т.е. расширение мы получаем за счет того что класс-сужение является потомком. примерно вот такое код:
// Base class for the numbersclass Complex
{
...
public:
// operators
Complex& operator+ (Complex& cmplx){...};
Complex& operator- (Complex& cmplx);
Complex& operator* (Complex& cmplx);
Complex& operator/ (Complex& cmplx);
...
protected:
// Complex fieldsfloat real;
float imag;
...
};
// Real numbers classclass Real : public Complex
{
...
public:
Real& operator+(Real& value){...};
...
};
А вопрос вот в чем — при попытке потом выполнить такую вот конструкцию —
Complex с(1,2);
Real r(2);
Complex a = c+r;
Все работает. Но если мы ПОМЕНЯЕМ слагаемые местами — перестает. Вот так:
Complex с(1,2);
Real r(2);
Complex a = r+с;
Ошибка при компиляции — "не могу привести тип Complex к типу Real"... То есть оно вызывает новый метод и в упор не видит унаследованного...
Вот...
Я видимо чего то не знаю, я понимал что это 2 разных метода (у них даже сигнатура разная!!!)
Подскажете в чем трабла???
если охота письмо — lexaux(DOG-WOOF-WOOF)gmail.com
СПаСИБО!
Здравствуйте, Roman Odaisky, Вы писали:
RO>Разве сложно сделать это с шаблонами?
RO>...
RO>Может, выглядит менее красиво, чем полиморфный вариант, зато быстрее. Дефайны могут помочь в сокращении записи.
Небольшое дополнение: уж если необходимо выводить общий тип, то лучше это делать так же, как и встроенные операторы (usual arithmetic conversions). Копирую сюда (5/9) на случай если у автора нет копии стандарта:
Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called theusual arithmetic conversions, which are defined as follows:
If either operand is of type long double, the other shall be converted to long double.
Otherwise, if either operand is double, the other shall be converted to double.
Otherwise, the integral promotions (4.5) shall be performed on both operands.
Then, if either operand is unsigned long the other shall be converted to unsigned long.
Otherwise, if one operand is a long int and the other unsigned int, then if a long int can represent all the values of an unsigned int, the unsigned int shall be converted to a long int; otherwise both operands shall be converted tounsigned long int.
Otherwise, if either operand is long, the other shall be converted to long.
Otherwise, if either operand is unsigned, the other shall be converted to unsigned.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Разве сложно сделать это с шаблонами? RO>Может, выглядит менее красиво, чем полиморфный вариант, зато быстрее. Дефайны могут помочь в сокращении записи.
попытался немного упростить ваш вариант и избежать многочисленных специализаций, но пришлось в каждом классе поддерживать возможность ребиндинга.
все это воспринимать как шутошный эксперимент