На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Как внутри шаблонной функции узнать передаваемый в неё тип данных?
    Сабж.

    Допустим мне нужно узнать какой именно массив данных мне передаёться (char или wchar_t)?
      ExpandedWrap disabled
        if(sizeof(T)==sizeof(wchar_t))
        {
          //wchar_t
        }
        else
          if(sizeof(T)==sizeof(char))
          {
            //char
          }
      Сообщение отредактировано: ElcnU -
        2 а если T это указатель? оно вернет 4 байта... в обеих случаях...

        Добавлено
        есть вариант _msize(T)/sizof(char)
        и _msize(T)/sizof(wchar_t) и если один больше другого в 2 раза... :) на это по моему через джопу...

        Добавлено
        есть хм... другие способы?
          или используй перегрузку функций
          или посмотри boost::type_traits
          или поищи в поиске по форуму - подобные темы иногда появлялись
            ExpandedWrap disabled
              #include <iostream>
               
              template<typename T>
              class C
              {
              public:
                  C()
                  {
                      T* a;
                      std::cout<<sizeof(**a)<<std::endl;
                  };
              };
               
              int main()
              {
                  C<char*> c1;
                  C<short*> c2;
                  C<wchar_t*> c3;
              }

            gcc версия 4.1.2
              Есть:
              ExpandedWrap disabled
                template< class U, class V >
                struct TypesEqual
                {
                    enum { result = false };
                };
                 
                template< class T >
                struct TypesEqual< T, T >
                {
                    enum { result = true };
                };
                 
                if (TypesEqual< T, wchar_t >::result)
                  // wchar_t
                else if (TypesEqual< T, char >::result)
                  // char
                1. Можно объявить специализацию для каждого из типов = не нужна шаблонная функция,
                если кроме этих типов ничего другого нет.

                2. включить RTTI, использовать typeid/type_info
                http://msdn.microsoft.com/en-us/library/fyf39xec.aspx
                  Ессно, в бусте есть аналог и намного более продвинутый :).
                    Цитата
                    Допустим мне нужно узнать какой именно массив данных мне передаёться (char или wchar_t)?


                    Цитата
                    есть хм... другие способы?


                    А зачем, по Вашему, выдумали специализацию шаблонов? :blink:
                      Всем спасибо.
                        Цитата Hsilgos @
                        А зачем, по Вашему, выдумали специализацию шаблонов?

                        в функциях специализация не рекомендуется...
                        то ли перегрузка ее "затирает" то ли еще что-то
                          Цитата archimed7592 @
                          Ессно, в бусте есть аналог и намного более продвинутый

                          А что такого продвинутого может быть в boost::is_same? :unsure: Разве что поддержка старых компиляторов, у которых проблемы с частичной специализацией.
                            Цитата Dantes @
                            А что такого продвинутого может быть в boost::is_same? :unsure: Разве что поддержка старых компиляторов, у которых проблемы с частичной специализацией.

                            Мне казалось, что там для двух типов ещё выясняются родственные связи(наследование) и что-то ещё. Возможно, что-то путаю.
                              Цитата archimed7592 @
                              Мне казалось, что там для двух типов ещё выясняются родственные связи(наследование) и что-то ещё.

                              Так это с помощью других шаблонных классов делается - boost::is_base_of и т.д.
                                если ты глубоко залезешь в метапрограммирование, то иногда обычный is_same тебе не поможет
                                для этого в mpl есть собственный equal - более "продвинутая" версия :)

                                помню, это обсуждалось в туториале по mpl - части "dimentional analisys"

                                это так, к слову
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0644 ]   [ 15 queries used ]   [ Generated: 22.05.24, 02:26 GMT ]