Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.40.4] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Сабж.
Допустим мне нужно узнать какой именно массив данных мне передаёться (char или wchar_t)? |
Сообщ.
#2
,
|
|
|
if(sizeof(T)==sizeof(wchar_t)) { //wchar_t } else if(sizeof(T)==sizeof(char)) { //char } |
Сообщ.
#3
,
|
|
|
2 а если T это указатель? оно вернет 4 байта... в обеих случаях...
Добавлено есть вариант _msize(T)/sizof(char) и _msize(T)/sizof(wchar_t) и если один больше другого в 2 раза... на это по моему через джопу... Добавлено есть хм... другие способы? |
Сообщ.
#4
,
|
|
|
или используй перегрузку функций
или посмотри boost::type_traits или поищи в поиске по форуму - подобные темы иногда появлялись |
Сообщ.
#5
,
|
|
|
#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 |
Сообщ.
#6
,
|
|
|
Есть:
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 |
Сообщ.
#7
,
|
|
|
1. Можно объявить специализацию для каждого из типов = не нужна шаблонная функция,
если кроме этих типов ничего другого нет. 2. включить RTTI, использовать typeid/type_info http://msdn.microsoft.com/en-us/library/fyf39xec.aspx |
Сообщ.
#8
,
|
|
|
Ессно, в бусте есть аналог и намного более продвинутый .
|
Сообщ.
#9
,
|
|
|
Цитата Допустим мне нужно узнать какой именно массив данных мне передаёться (char или wchar_t)? Цитата есть хм... другие способы? А зачем, по Вашему, выдумали специализацию шаблонов? |
Сообщ.
#10
,
|
|
|
Всем спасибо.
|
Сообщ.
#11
,
|
|
|
Цитата Hsilgos @ А зачем, по Вашему, выдумали специализацию шаблонов? в функциях специализация не рекомендуется... то ли перегрузка ее "затирает" то ли еще что-то |
Сообщ.
#12
,
|
|
|
Цитата archimed7592 @ Ессно, в бусте есть аналог и намного более продвинутый А что такого продвинутого может быть в boost::is_same? Разве что поддержка старых компиляторов, у которых проблемы с частичной специализацией. |
Сообщ.
#13
,
|
|
|
Цитата Dantes @ А что такого продвинутого может быть в boost::is_same? Разве что поддержка старых компиляторов, у которых проблемы с частичной специализацией. Мне казалось, что там для двух типов ещё выясняются родственные связи(наследование) и что-то ещё. Возможно, что-то путаю. |
Сообщ.
#14
,
|
|
|
Цитата archimed7592 @ Мне казалось, что там для двух типов ещё выясняются родственные связи(наследование) и что-то ещё. Так это с помощью других шаблонных классов делается - boost::is_base_of и т.д. |
Сообщ.
#15
,
|
|
|
если ты глубоко залезешь в метапрограммирование, то иногда обычный is_same тебе не поможет
для этого в mpl есть собственный equal - более "продвинутая" версия помню, это обсуждалось в туториале по mpl - части "dimentional analisys" это так, к слову |