На основании этого ответа...
... Я написал этот код:
static TVALUE getUpperBound()
{
SomeStruct<TVALUE>* t;
try
{
dynamic_cast<SomeStruct<bool>*> (t);
return 1;
}
catch (int e)
{
}
try
{
dynamic_cast<SomeStruct<unsigned char>*> (t);
return 255;
}
catch (int e)
{
}
try
{
dynamic_cast<SomeStruct<unsigned int>*> (t);
return 65535;
}
catch (int e)
{
}
return 0;
}
Но не работает :-/
Я знаю, что есть ДРУГИЕ способы сделать это (используя включения), но мне нужно, чтобы этот метод работал.
Я не могу включать какие-либо включения в свой код (это длинная история, но я просто не могу)... отсюда и эта попытка сделать что-то, что можно было бы легко сделать с помощью climits или typeinfo.
Может ли кто-нибудь объяснить мне, почему это не работает?
Редактировать 1:
Спасибо, парни. Я пропустил бит ссылки и указателя.
Это работает сейчас:
template <typename TVALUE>
TVALUE getUpperBound()
{
SomeStruct<TVALUE>* t;
if (dynamic_cast<SomeStruct<bool>*> (t) != nullptr)
return 1;
if (dynamic_cast<SomeStruct<unsigned char>*> (t) != nullptr)
return 255;
if (dynamic_cast<SomeStruct<unsigned int>*> (t) != nullptr)
return 65535;
return 0;
}
Редактировать 2:
Я попробовал совет @StilesCrisis и использовал специализацию шаблона.
template <typename TVALUE>
TVALUE getUpperBound();
template <>
bool getUpperBound<bool>()
{
return 1;
}
template <>
unsigned char getUpperBound<unsigned char>()
{
return 255;
}
template <>
unsigned int getUpperBound<unsigned int>()
{
return 65535;
}
Работает очарование. Гораздо лучшая реализация. Спасибо!
numeric_limits
. :) - person StilesCrisis   schedule 21.09.2014