Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ограничение шаблонов классов...

3.1K
17 октября 2003 года
man
38 / / 17.10.2003
У меня есть класс, который работает с полиномами.. проще говоря, с многочленами. На данном этапе его описание выглядит так:
template <class TNumber> class TPolynomial { ... }

В чём проблема?
Проблема в том, что если мы пишем вот так

TPolynomial<char*> q;

Всё замечательно проходит... ну, конечно, куча варнингов и т.д. и т.п. НО! всё компилится, и исполняется с дурью на экране.

Можно ли ограничить параметр шаблона на скалярные мат. типы (int, float и т.д.)

Есть ещё идея сделать вот так:

typedef double MyType

и в теле класса везде использовать MyType, приводя всё к double...может и проще, но как то не очень красиво...

Перегрузить конструкторы - каждый для своего типа, тоже как то не особо... прога будет толстеть потихоньку... Идея использования RTTI, типа проверяем тип, и если что кидаем исключение не очень... гораздо круче получить сообщение об ошибке на стадии компиляции, а не когда у тебя уже всё померло X)-
Должен быть ещё какой-то способ... истина где-то рядом;)
3
17 октября 2003 года
Green
4.8K / / 20.01.2000
Я советую почитать книгу Андрея Александреску "Modern C++ design", для самостоятельного решения подобных задач

Решение проблемы, на мой взгляд, в ведении олного дополнительного класса CGuard:

Код:
template<class TNumber>
class TPolynomial
{
  ..................
  ..................
};


template<class TNumber>
class CGuard
{};

template<>
class CGuard<int> :public TPolynomial<int>
{};

template<>
class CGuard<float> :public TPolynomial<float>
{};


Внимание, на VC++ ниже 7, возможно, работать не будет.
3.1K
18 октября 2003 года
man
38 / / 17.10.2003
Класс! Сольный проход, комбинация из наследования и специализации, гол!!! Так сыграть на особенности наследования конструкторов.. гениально!
Осталось только додуматься как бы не дать пользователю воспользоваться TPolynomial...
3
18 октября 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by man
Осталось только додуматься как бы не дать пользователю воспользоваться TPolynomial...



Можно вот так:

Код:
template<class TNumber>
class TPolynomial
{
protected:
    TPolynomial() {}
    ~TPolynomial() {}
};


template<class TNumber>
class CGuard
{};

template<>
class CGuard<int> :public TPolynomial<int>
{};

template<>
class CGuard<float> :public TPolynomial<float>
{};
3.1K
18 октября 2003 года
man
38 / / 17.10.2003
Ну всё! Для меня Вы теперь уважаемый человек! No comments что называется..
3
19 октября 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by man
Ну всё! Для меня Вы теперь уважаемый человек! No comments что называется..



Никогда не знал, как реагировать на лесть.:angel:

На самом деле секрет прост - всего три книги:
- Б.Страуструп, "Язык программирования С++",
- Э.Гамма и др, "Паттерны проектирования",
- А.Александреску, "Modern C++ Design", есть русский перевод

ну и опыт применения всего этого.

P.S.
сводная информация по паттернам на
http://ooad.asf.ru/patterns/
Электронные книги, в т.ч. Александреску
http://anatolix.naumen.ru/cppbooks.htm

3.1K
19 октября 2003 года
man
38 / / 17.10.2003
Ну, на самом деле, говорить лесть мне не свойственно, а это - первая реакция. Для меня это всё, пока что кажется высшим пилотажем. А школьный код совсем не похож на промышленный ;)
Спасибо за информацию! Обязательно включю эти книги в свою библиотеку! :) Страуструп у меня уже давно, но если честно, то читается он с напрягом... не то, что Ритчи и Керниган, хоть и чистый С, но очень толково ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог