Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Две версии operator* с разными возвр. значениям


Автор: ANTON_AL 3.7.2007, 13:28
Доброго дня!

Есть класс. У него должна быть одна из двух версий operator* с одинаковыми параметрами, которые различаются только возвращаемыми значениями. Нужно сделать так, чтобы в зависимости от переданного шаблонного параметра была реализована та, или иная версия operator*.
Код должен выглядить примерно так:

Код


enum Behavior
{
   FIXED,
   GROOVED
}

template< Behavior Type >
class Vector1
{
     //...

     //Должно быть что то, такого вида:
     if ( Type == FIXED )
        Vector1 operator* ( const Vector1 &rhs) { }
    else
       Vector2  operator* ( const Vector1 &rhs) { }
};



Т.е, ключевой момент в том, чтобы использовать ветвление по параметру шаблона, которое касается объявления, как по аналогии с #ifndef....#define....#endif


Автор: HappyLife 3.7.2007, 13:36
Перегрузка возможна только с разными параметрами, а не с разными возвращаемыми значениями.

Автор: ANTON_AL 3.7.2007, 13:43
Речь здесь идёт не о перегрузке, а о реализации одной из двух версий operator* в зависимости от переданного шаблонного параметра.

Автор: MAKCim 3.7.2007, 13:54
Код

template<bool, class T1, class T2> struct __if {
    typedef T2 type;
};
template<class T1, class T2> struct __if<true, T1, T2> {
    typedef T1 type;
};

template<Behaviour T> class A;
template<Behaviour T> class B;

template<class T, Behaviour K> class wrapper;
template<Behaviour K> class wrapper<A<K>, K> {
public:
    A<K>& operator*(const A<K>& rhs) {}
};
template<Behaviour K> class wrapper<B<K>, K> {
public:
    B<K>& operator*(const A<K>& rhs) {}
};

template<Behaviour T> class B {};

template<Behaviour T> class A :
    public wrapper<typename __if<T == FIXED, A<T>, B<T> > :: type, T> {

};

Автор: Daevaorn 3.7.2007, 14:49
ANTON_AL, специализация шаблонного класса тебе поможет. а вообще лучше меняй дизайн.

Автор: korbian 3.7.2007, 15:19
MAKCim,  что есть Behaviour?

Вопрос снят, простите за невнимательность.  smile 

Автор: MAKCim 3.7.2007, 15:21
korbian, 
откуда я знаю?  smile 
спроси у ANTON_AL 

Автор: korbian 3.7.2007, 15:22
См. выше редакцию.  smile 

Автор: ANTON_AL 3.7.2007, 20:03
MAKCim, Спасибо за пример. Хороший приём. smile 

Этот класс, для которого нужна одна из двух версий operator* представляет собой 
алгоритмическое число с фиксированной точкой, которое будет использоваться в разрабатываемой библиотеке алгоритмов.

При умножении двух чисел, если мы хотим сохранить данные и избежать переполнения, нужно результат хранить в числе, разрядность которого в два раза больше, т.е. WORD*WORD = DWORD

В одних алгоритмах требуется сохранять данные ( т.е. WORD*WORD = DWORD ), в других нет 
( WORD*WORD = WORD ). А класс этого числа будет для всех алгоритмов один. Вот в этом и была проблема с реализацией одного из двух operator* для числа, в зависимости от его типа поведения ( Behavior: защищённое от переполнения/ не защищённое)
Проблему решил, просто сделав switch в коде. Геморно, но пока работает. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)