Погода: -12°C
  • Есть интерфейс:
    template void func(T t);

    Возможно ли описанием лишь двух шаблонных функций добиться того, чтобы, скажем, для всех интегральных типов вызывалась одна его имплементация, а для всех указателей на них - другая.
    В более общем случае - одна имплементация для произвольного избранного набора типов, вторая - для всех остальных.

  • вот так:



    #include <iostream>



    template <class T> void func(T){

    std::cout << "other" << std::endl;

    }



    void func(int){

    std::cout << "int" << std::endl;

    }



    int main(void){

    func(1);

    func(1.2);

    func("aaaa");

    return 0;

    }



    или мною что-то не правильно понято?

  • Похоже, что неправильно...

    Мне нужна перегрузка шаблонной функции не для одного конкретного типа, а для целого набора, который, в принципе, может быть очень большим, хотя имплементация - одна и та же.
    Перегрузка или специализация шаблона для каждого из этих типов не только накладна и философски неправильна, но и просто невозможна.

    Даже если я опишу отдельные специализации для всех существующих на сегодня интегральных типов, которых десятки (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); //ни один из типов выше не подошел
    }

    Знаю, что есть способ лучше, но в голову пока не пришел :eek:

    ЗЫ. Для красоты можно попробовать enum TFavourites {YourType1; YourType2; /*...*/}; и далее играться ну короче с++ мощный язык там куча способов сделать одно и то же

    KIA cee'd 1,6 AT EX Compass Blue 2009

  • Возможно, для наиболее общего решения действительно никуда от dynamic_cast не денешься... Хотя приплетать сюда ветвление в рантайме не всегда приемлемо из-за производительности, например.

    Для своей, упрощенной, задачи я нашел решение у Страуструпа - тонкая игра на "точности специализации".

    template func (T t);
    template func (T* t);

    И только так :-)
    Вторая имплементация будет вызываться для указателей, первая - для всех остальных типов.

Записей на странице:

Перейти в форум

Модератор: