Возможно ли описанием лишь двух шаблонных функций добиться того, чтобы, скажем, для всех интегральных типов вызывалась одна его имплементация, а для всех указателей на них - другая.
В более общем случае - одна имплементация для произвольного избранного набора типов, вторая - для всех остальных.
Мне нужна перегрузка шаблонной функции не для одного конкретного типа, а для целого набора, который, в принципе, может быть очень большим, хотя имплементация - одна и та же.
Перегрузка или специализация шаблона для каждого из этих типов не только накладна и философски неправильна, но и просто невозможна.
Даже если я опишу отдельные специализации для всех существующих на сегодня интегральных типов, которых десятки (int, unsigned int, const int, const unsigned int, ......), никто не гарантирует того, что завтра не появятся новые... Не говоря уже о том, что область применения может ими и не ограничиться.
Интерфейс же, однажды имплементированный, предполагается использовать в дальнейшем весьма интенсивно, а о его модификации хочется забыть навсегда...
Надо рассказать шаблонной функции о типе параметра, используя RTTI (определение типа на этапе выполнения).
dynamic_cast(p) смотрит на p. Если этот объект типа T (или p может быть к нему приведен, напр. на базовый класс), то возвращается T* = &p, в противном случае NULL.
template void your_func1(T t); //для одних типов Т
template void your_func1(T t); //для других типов Т
template void func(T t)
//проверяем тип и вызываем соов. функцию
{
if(pt = dynamic_cast(t)) your_func1(t);
//далее проверяем на типы YourType2 etc.
your_func2(t); //ни один из типов выше не подошел
}
Знаю, что есть способ лучше, но в голову пока не пришел
ЗЫ. Для красоты можно попробовать enum TFavourites {YourType1; YourType2; /*...*/}; и далее играться ну короче с++ мощный язык там куча способов сделать одно и то же
Возможно, для наиболее общего решения действительно никуда от dynamic_cast не денешься... Хотя приплетать сюда ветвление в рантайме не всегда приемлемо из-за производительности, например.
Для своей, упрощенной, задачи я нашел решение у Страуструпа - тонкая игра на "точности специализации".
template func (T t);
template func (T* t);
И только так :-)
Вторая имплементация будет вызываться для указателей, первая - для всех остальных типов.
Информация о возрастных ограничениях в отношении информационной продукции, подлежащая распространению на основании норм Федерального закона «О защите детей от информации, причиняющей вред их здоровью и развитию».
Некоторые материалы настоящего раздела могут содержать информацию, запрещенную для детей.