template<class TNumber>
class TPolynomial
{
..................
..................
};
template<class TNumber>
class CGuard
{};
template<>
class CGuard<int> :public TPolynomial<int>
{};
template<>
class CGuard<float> :public TPolynomial<float>
{};
Ограничение шаблонов классов...
template <class TNumber> class TPolynomial { ... }
В чём проблема?
Проблема в том, что если мы пишем вот так
TPolynomial<char*> q;
Всё замечательно проходит... ну, конечно, куча варнингов и т.д. и т.п. НО! всё компилится, и исполняется с дурью на экране.
Можно ли ограничить параметр шаблона на скалярные мат. типы (int, float и т.д.)
Есть ещё идея сделать вот так:
typedef double MyType
и в теле класса везде использовать MyType, приводя всё к double...может и проще, но как то не очень красиво...
Перегрузить конструкторы - каждый для своего типа, тоже как то не особо... прога будет толстеть потихоньку... Идея использования RTTI, типа проверяем тип, и если что кидаем исключение не очень... гораздо круче получить сообщение об ошибке на стадии компиляции, а не когда у тебя уже всё померло X)-
Должен быть ещё какой-то способ... истина где-то рядом;)
Решение проблемы, на мой взгляд, в ведении олного дополнительного класса CGuard:
Код:
Внимание, на VC++ ниже 7, возможно, работать не будет.
Осталось только додуматься как бы не дать пользователю воспользоваться TPolynomial...
Цитата:
Originally posted by man
Осталось только додуматься как бы не дать пользователю воспользоваться TPolynomial...
Осталось только додуматься как бы не дать пользователю воспользоваться 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>
{};
class TPolynomial
{
protected:
TPolynomial() {}
~TPolynomial() {}
};
template<class TNumber>
class CGuard
{};
template<>
class CGuard<int> :public TPolynomial<int>
{};
template<>
class CGuard<float> :public TPolynomial<float>
{};
Ну всё! Для меня Вы теперь уважаемый человек! No comments что называется..
Цитата:
Originally posted by man
Ну всё! Для меня Вы теперь уважаемый человек! No comments что называется..
Ну всё! Для меня Вы теперь уважаемый человек! No comments что называется..
Никогда не знал, как реагировать на лесть.:angel:
На самом деле секрет прост - всего три книги:
- Б.Страуструп, "Язык программирования С++",
- Э.Гамма и др, "Паттерны проектирования",
- А.Александреску, "Modern C++ Design", есть русский перевод
ну и опыт применения всего этого.
P.S.
сводная информация по паттернам на
http://ooad.asf.ru/patterns/
Электронные книги, в т.ч. Александреску
http://anatolix.naumen.ru/cppbooks.htm
Спасибо за информацию! Обязательно включю эти книги в свою библиотеку! :) Страуструп у меня уже давно, но если честно, то читается он с напрягом... не то, что Ритчи и Керниган, хоть и чистый С, но очень толково ;)