Терминологический вопрос
От: SAnton  
Дата: 26.01.04 17:11
Оценка:
Господа! Как правильно обозвать такой вид шаблона?
class X{
public:
   size_t cnt;
   X():cnt(0){}
   template <typename P> void Test(){cnt+=sizeof(P);}
};


Я правильно понимаю, что это не “частичная специализация”?
А если это все же она, то почему она у меня под VC7 работает?
Re: Терминологический вопрос
От: BOPOH_N Россия  
Дата: 26.01.04 17:19
Оценка:
Здравствуйте, SAnton, Вы писали:

SA>Господа! Как правильно обозвать такой вид шаблона?

SA>
SA>class X{
SA>public:
SA>   size_t cnt;
SA>   X():cnt(0){}
SA>   template <typename P> void Test(){cnt+=sizeof(P);}
SA>};
SA>


SA>Я правильно понимаю, что это не “частичная специализация”?

SA>А если это все же она, то почему она у меня под VC7 работает?

Это точно не частичная специализация
Это наверное можно обозвать "шаблоном метода класса".
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re[2]: Терминологический вопрос
От: SAnton  
Дата: 26.01.04 17:26
Оценка:
Здравствуйте, BOPOH_N, Вы писали:

BOP>Это точно не частичная специализация

BOP>Это наверное можно обозвать "шаблоном метода класса".

Спасибо!
Re: Терминологический вопрос
От: Кодт Россия  
Дата: 26.01.04 17:43
Оценка:
Здравствуйте, SAnton, Вы писали:

SA>Господа! Как правильно обозвать такой вид шаблона?

SA>
SA>class X{
SA>public:
SA>   size_t cnt;
SA>   X():cnt(0){}
SA>   template <typename P> void Test(){cnt+=sizeof(P);}
SA>};
SA>


Шаблонная функция — член класса.

SA>Я правильно понимаю, что это не “частичная специализация”?

template<class A, class B>
class Foo
{ ... };

template<class A>
class Foo<A, int> // частичная специализация
{ ... };

template<class A>
class Foo< vector<A>, list<A> > // частичная специализация
{ ... };

template<>
class Foo<char, int> // полная специализация
{ ... };


SA>А если это все же она, то почему она у меня под VC7 работает?


Не она, поэтому и работает
Перекуём баги на фичи!
Re[2]: offtop
От: Аноним  
Дата: 26.01.04 17:54
Оценка:
К>Не она, поэтому и работает
-Не он?
-Не он!
-Не яааа!!!
Re[2]: Терминологический вопрос
От: SAnton  
Дата: 26.01.04 19:02
Оценка:
Здравствуйте, Кодт, Вы писали:

SA>>Я правильно понимаю, что это не “частичная специализация”?

К>template<class A>
К>class Foo<A, int> // частичная специализация
К>{ ... };

К>template<class A>
К>class Foo< vector<A>, list<A> > // частичная специализация
К>{ ... };


А зачем эта специализация вообще нужна?
template <typename A>class Foo{
public:
    A x;
    Foo():x(0){}
    template<typename B,A c>A test2(){return с+(A)sizeof(B);}    
    template<typename B>void test(){x+=test2<B,1>();}
};
template<class A>
class Foo2{
    typedef vector<A> Vector;
    typedef list<A> List;
public:    
    List a;
    Vector b;
};


Где можно про это прочитать? Умом понимаю, что это что-то нужное, а вот понять для чего не получается.
Re[3]: Терминологический вопрос
От: Кодт Россия  
Дата: 26.01.04 19:31
Оценка:
Здравствуйте, SAnton, Вы писали:

SA>А зачем эта специализация вообще нужна?

SA>
SA>template <typename A>class Foo{
SA>public:
SA>    A x;
SA>    Foo():x(0){}
SA>    template<typename B,A c>A test2(){return с+(A)sizeof(B);}    
SA>    template<typename B>void test(){x+=test2<B,1>();}
SA>};
SA>template<class A>
SA>class Foo2{
SA>    typedef vector<A> Vector;
SA>    typedef list<A> List;
SA>public:    
SA>    List a;
SA>    Vector b;
SA>}; 
SA>

Это ты привел пример — как можно обойти частичную специализацию.
См. также статью Павла Кузнецова http://www.rsdn.ru/article/cpp/simulation.xml
Автор(ы): Павел Кузнецов
Дата: 05.03.2003
Время от времени при работе с шаблонами возникает необходимость специализировать шаблон класса по одному из аргументов. В качестве примера можно рассмотреть шаблон классов матриц, параметризованный типом элемента и размерами матрицы. Однако некоторые компиляторы не поддерживают частичную специализацию, и, как следствие, «не понимают» подобные конструкции. Желание получить эквивалентную функциональность при работе с такими компиляторами приводит к технике, описанной ниже.
.

А вот здесь её не объехать:
template<class R>
struct func_traits< R(*)() >
{
  enum { arity=0 };
  typedef R result_type;
};

template<class R, class A>
struct func_traits< R(*)(A) >
{
  enum { arity=1 };
  typedef R result_type;
  typedef A arg1_type;
};

template<class R, class A, class B>
struct func_traits< R(*)(A,B) >
{
  enum { arity=1 };
  typedef R result_type;
  typedef A arg1_type;
  typedef B arg2_type;
};

SA>Где можно про это прочитать? Умом понимаю, что это что-то нужное, а вот понять для чего не получается.


Александреску "Современное программирование на С++"
что-то больше ничего в голову не идёт.

Поиском на RSDN — тоже освежает: www.rsdn.ru/search?q=частичная+специализация
Перекуём баги на фичи!
Re[4]: Терминологический вопрос
От: SAnton  
Дата: 26.01.04 19:42
Оценка:
Здравствуйте, Кодт, Вы писали:


К>Александреску "Современное программирование на С++"

К>что-то больше ничего в голову не идёт.

К>Поиском на RSDN — тоже освежает: www.rsdn.ru/search?q=частичная+специализация


Спасибо, осознал! Буду искать книжку. Кстати, в электронном виде она встречается?
Re[2]: Терминологический вопрос
От: Павел Кузнецов  
Дата: 27.01.04 10:22
Оценка: 15 (1)
Здравствуйте, Кодт, Вы писали:

К> Шаблонная функция — член класса.


Шаблон функции — члена класса.

"Шаблонная функция", равно как и "шаблонный класс" — о другом. Эти термины иногда
употреблялись для обозначения специализаций шаблонов. В современной литературе их
не употребляют (Стандарт, книга Вандевурда и т.п.).
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.