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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> опять шаблоны 
:(
    Опции темы
MAKCim
Дата 22.1.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



есть
Код

template<class T, bool b> class A {};
template<class T> class A<T,true>
{
private:
    typedef bool (T::*member)(const T&);
    static void check()
    {
        member ptr_a, ptr_b;
        ptr_a=&T::operator<;
        ptr_b=&T::operator==;
    }
public:
    ~A() {check();}
};

template<class T, class C> class P2
      : private A<C,checking<C>::value> {...};

//checking определяет, является ли C классом, ::value=0 - не является, =1 - является
//класс определен где-то выше

template<class T> class P1 {...};

template
      <
         class U, 
         class V, 
         template<class> class T=P1, 
         template<class, class> class C=P2
      > class Q: public T<C<U,V> > {...};

вопрос, почему если создать один класс
Код

class D 
{
};

и создать объект типа Q
Код

Q<double,D> w;

нет ошибки компиляции, ведь в D нет operator<(const D&) и operator==(const D&)?
возможно просто P2<double,D> нигде не создается


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

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


Эксперт
***


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

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



MAKCim, напиши w.check() и этот оператор потребуется


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Earnest
Дата 22.1.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



MAKCim, методы шаблона инстационируются только при использовании.

Продолжаешь вгрызаться в Александреску? smile


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


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


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

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



Цитата

Продолжаешь вгрызаться в Александреску?

и в Джосаттиса параллельно smile
Цитата

MAKCim, методы шаблона инстационируются только при использовании.

это я знаю, как тогда такое объяснить
Код

template<class T> class A
{
private:
    typedef void (T::*pointer)();
    static void check()
    {
        pointer p=&T::F;
    }
public:
    ~A() {check();}
};

template<class T> class B
    : private A<T> {};

class C {};

int main()
{
    B<C> w;            //compile-time ошибка, то что надо
    return 0;
}

при создании B<C> вызывается конструктор A<C> но не деструктор ~A<C>
или конструкторы и деструкторы всегда оцениваются при инстанцировании, но тогда почему не сработал пример в первом посте


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

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


^аВаТаР^ сообщение>>
****


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

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



MAKCim
Используйте enum'ы.
И кстати требовать наличие operator< как member'а имхо не совсем обносновано.
Он ведь может быть и просто ф-цией.
Я б на вашем месте делал примерно так:

Код

class NullType{};
template<class A, class B>
struct OperatorLessMustExist
{
        enum{
                Value = sizeof(  (*static_cast<A*>(0))  <
                                 (*static_cast<B*>(0))) 
        };
};



template <class T>
class SomeClass
{
        private:
        enum{
                CheckOperators = OperatorLessMustExist<T,T>::Value
        };
};

class FooBar{};

bool operator < (const FooBar&, const FooBar&);


class FooBar2{
        public:
        bool operator <(const FooBar2&);

};

int main(){
        SomeClass<int> sc1; //работает со стандартными типами 
//      SomeClass<NullType> sc2; //не работает и не должно
        SomeClass<FooBar> sc3; //работает с ф-цией
        SomeClass<FooBar2> sc4; //работает с членом
}




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
chipset
Дата 22.1.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(MAKCim @ 22.1.2006, 04:26 Найти цитируемый пост)

B<C> w;            //compile-time ошибка, то что надо

Цитата(MAKCim @ 22.1.2006, 04:26 Найти цитируемый пост)

при создании B<C> вызывается конструктор A<C> но не деструктор ~A<C>

В смисле? У меня происходит compile-time ошибка в строке 7, т.е. деструктор вызываеться.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
zss
Дата 22.1.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mayk @ 22.1.2006, 14:38 Найти цитируемый пост)

MAKCim
Используйте enum'ы.


извините, что здесь задаю вопрос, но я тоже пытаюсь разобраться с Александреску
и много не понятно

например
Код

class NullType {};
template <class T> struct A;
template <> struct A <NullType>{
   enum { value = 0;}
}



чесно говоря не понятно что это (особенно что это представляет из себя после компиляции)
PM MAIL ICQ   Вверх
Void
Дата 22.1.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(zss @ 22.1.2006, 21:50 Найти цитируемый пост)
чесно говоря не понятно что это (особенно что это представляет из себя после компиляции)

Ровным счетом ничего smile В том-то и дело, что это метапрограммирование на шаблонах — программирование на этапе компиляции, программирование, преобразующее саму программу.
Тебе понятна суть специализации и частичной специализации шаблонов? Если да, читай дальше, IIRC у Александреску по ходу дела много практических примеров, должно помочь в понимании.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
MAKCim
Дата 22.1.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата

чесно говоря не понятно что это (особенно что это представляет из себя после компиляции)

например если есть класс
Код

template<class T, class check=A<T> > class P {...};

то при его инстанцировании конкретным типом будет ошибка во время компиляции если T не NullType


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

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


Опытный
**


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

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



Цитата(Void @ 22.1.2006, 20:00 Найти цитируемый пост)

Тебе понятна суть специализации и частичной специализации шаблонов?

это понятно
но по моему вопросу - не понятно smile
Добавлено @ 22:51
Цитата(MAKCim @ 22.1.2006, 20:17 Найти цитируемый пост)

то при его инстанцировании конкретным типом будет ошибка во время компиляции если T не NullType


а мне казалось, что это для показания конца списка типов. Но как показал поиск типа - NUllType там никаким боком не пришит smile - поэтому и не понятен его смысл
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0846 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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