Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Две версии operator* с разными возвр. значениям 
:(
    Опции темы
ANTON_AL
Дата 3.7.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Доброго дня!

Есть класс. У него должна быть одна из двух версий 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


PM MAIL   Вверх
HappyLife
Дата 3.7.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Перегрузка возможна только с разными параметрами, а не с разными возвращаемыми значениями.
PM MAIL   Вверх
ANTON_AL
Дата 3.7.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) ANTON_AL - 3.7.2007, 13:44
PM MAIL   Вверх
MAKCim
Дата 3.7.2007, 13:54 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

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> {

};


Это сообщение отредактировал(а) MAKCim - 3.7.2007, 14:13


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Daevaorn
Дата 3.7.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



ANTON_AL, специализация шаблонного класса тебе поможет. а вообще лучше меняй дизайн.
PM MAIL WWW   Вверх
korbian
Дата 3.7.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 2
Всего: 14



MAKCim,  что есть Behaviour?

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

Это сообщение отредактировал(а) korbian - 3.7.2007, 15:21


--------------------
korbian ©
PM   Вверх
MAKCim
Дата 3.7.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



korbian, 
откуда я знаю?  smile 
спроси у ANTON_AL 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
korbian
Дата 3.7.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 2
Всего: 14



См. выше редакцию.  smile 


--------------------
korbian ©
PM   Вверх
ANTON_AL
Дата 3.7.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



MAKCim, Спасибо за пример. Хороший приём. smile 

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

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

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

Это сообщение отредактировал(а) ANTON_AL - 3.7.2007, 20:05
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.