От:
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 работает?
Не она, поэтому и работает
Перекуём баги на фичи!
От:
Аноним
Дата: 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]: Терминологический вопрос
Здравствуйте, Кодт, Вы писали:
К> Шаблонная функция — член класса.
Шаблон функции — члена класса.
"Шаблонная функция", равно как и "шаблонный класс" — о другом. Эти термины иногда
употреблялись для обозначения специализаций шаблонов. В современной литературе их
не употребляют (Стандарт, книга Вандевурда и т.п.).
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить