хитрая специализация.
От: Зверёк Харьковский  
Дата: 16.02.04 15:32
Оценка:
буду краток. возможно ли такое:
template<typename T>
void f()
{
}

template<typename T>
void f<std::vector<T> >() //специализация f для любого вектора
{
}
FAQ — це мiй ай-кью!
Re: хитрая специализация.
От: davenger  
Дата: 16.02.04 15:37
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>буду краток. возможно ли такое:

ЗХ>
ЗХ>template<typename T>
ЗХ>void f()
ЗХ>{
ЗХ>}

ЗХ>template<typename T>
ЗХ>void f<std::vector<T> >() //специализация f для любого вектора
ЗХ>{
ЗХ>}

ЗХ>


Для вектора и ваще для стандартных контейнеров это делать нельзя, а вот если б вместо вектора был другой шаблон с ровно одним параметром — то всё ок.
Re: хитрая специализация.
От: maikLa Россия  
Дата: 16.02.04 15:38
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>буду краток. возможно ли такое:

ЗХ>
ЗХ>template<typename T>
ЗХ>void f()
ЗХ>{
ЗХ>}

ЗХ>template<typename T>
ЗХ>void f<std::vector<T> >() //специализация f для любого вектора
ЗХ>{
ЗХ>}

ЗХ>


Вай нот?


З,Ы, Тип он и в std тип.
Re: хитрая специализация.
От: WolfHound  
Дата: 16.02.04 15:40
Оценка: 6 (1)
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>буду краток. возможно ли такое:

Нет. Для функций запрещена частичная специализация(интересно почему)
Но можно так
template<typename T>
struct f_t 
{
    static void f()
    {
    }
};
template<typename T, typename A>//Не забывает что у вектора естьл еще и аллокатор
struct f_t<std::vector<T, A> >
{
    static void f() //специализация f для любого вектора
    {
    }
};

template<typename T>
void f()
{
    f_t<T>::f();
}

Но и это решение не 100%ное ибо некоторые реализации STL могут содержать дополнительные шаблонные параметры. Но на практике можно использовать.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: хитрая специализация.
От: davenger  
Дата: 16.02.04 15:41
Оценка:
Здравствуйте, davenger, Вы писали:

D>Здравствуйте, Зверёк Харьковский, Вы писали:


ЗХ>>буду краток. возможно ли такое:

ЗХ>>
ЗХ>>template<typename T>
ЗХ>>void f()
ЗХ>>{
ЗХ>>}

ЗХ>>template<typename T>
ЗХ>>void f<std::vector<T> >() //специализация f для любого вектора
ЗХ>>{
ЗХ>>}

ЗХ>>


D>Для вектора и ваще для стандартных контейнеров это делать нельзя, а вот если б вместо вектора был другой шаблон с ровно одним параметром — то всё ок.


Сорри перепутал с template template параметром.
Т.е. всё ок.
Re[2]: хитрая специализация.
От: Зверёк Харьковский  
Дата: 16.02.04 15:42
Оценка:
Здравствуйте, maikLa, Вы писали:

L>Здравствуйте, Зверёк Харьковский, Вы писали:


ЗХ>>буду краток. возможно ли такое:

ЗХ>>
ЗХ>>template<typename T>
ЗХ>>void f()
ЗХ>>{
ЗХ>>}

ЗХ>>template<typename T> // бекоз!!!
ЗХ>>void f<std::vector<T> >() //специализация f для любого вектора
ЗХ>>{
ЗХ>>}

ЗХ>>


L>Вай нот?



L>З,Ы, Тип он и в std тип.
FAQ — це мiй ай-кью!
Re[2]: хитрая специализация.
От: Зверёк Харьковский  
Дата: 16.02.04 15:43
Оценка:
Здравствуйте, davenger, Вы писали:

D>Для вектора и ваще для стандартных контейнеров это делать нельзя,

почему?

D>а вот если б вместо вектора был другой шаблон с ровно одним параметром — то всё ок.

как?
FAQ — це мiй ай-кью!
Re[3]: хитрая специализация.
От: maikLa Россия  
Дата: 16.02.04 15:45
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>>>template<typename T> // бекоз!!!

ЗХ>>>void f<std::vector<T> >() //специализация f для любого вектора
ЗХ>>>{
ЗХ>>>}

ЗХ>>>[/c]


Нет, я заметил Но по-моему, ничего это не меняет.
Re: хитрая специализация.
От: Bell Россия  
Дата: 16.02.04 15:46
Оценка: 6 (1)
Здравствуйте, Зверёк Харьковский, Вы писали:

Частичная специализация функций невозможна. Используй перегрузку:


template<typename T>
void f(T t){}

template<class T>
void f(std::vector<T>& arr ){}
Любите книгу — источник знаний (с) М.Горький
Re[3]: хитрая специализация.
От: davenger  
Дата: 16.02.04 15:49
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>Здравствуйте, davenger, Вы писали:


D>>Для вектора и ваще для стандартных контейнеров это делать нельзя,

ЗХ>почему?

D>>а вот если б вместо вектора был другой шаблон с ровно одним параметром — то всё ок.

ЗХ>как?

Забыл про частичную специализацию ф-ций
Склероз...
Re: Всем спасибо, все свободны ;)
От: Зверёк Харьковский  
Дата: 16.02.04 15:49
Оценка:
Да мне, на самом деле, для классов-то и было нужно.
Но при экспериментах не учел разницу специализации классов и функций.
Извиняюсь за беспокойство.
FAQ — це мiй ай-кью!
Re[2]: хитрая специализация.
От: VNG Беларусь https://organicmaps.app/
Дата: 16.02.04 15:49
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Зверёк Харьковский, Вы писали:


ЗХ>>буду краток. возможно ли такое:

WH>Нет. Для функций запрещена частичная специализация(интересно почему)

template<typename T>
void f()
{
}

template<typename T>
void f<std::vector<T> >() //специализация f для любого вектора
{
}


А где здесь частичная специализация?
Re[3]: хитрая специализация.
От: WolfHound  
Дата: 16.02.04 15:51
Оценка:
Здравствуйте, VNG, Вы писали:

VNG>
VNG>template<typename T>
VNG>void f<std::vector<T> >() //специализация f для любого вектора
VNG>{
VNG>}
VNG>

VNG>А где здесь частичная специализация?
А это что?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: хитрая специализация.
От: VNG Беларусь https://organicmaps.app/
Дата: 16.02.04 15:55
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, VNG, Вы писали:


VNG>>
WH>VNG>template<typename T>
VNG>>void f<std::vector<T> >() //специализация f для любого вектора
WH>VNG>{
VNG>>}
VNG>>

VNG>>А где здесь частичная специализация?
WH>А это что?

Все верно. Извини за беспокойство.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.