У меня есть следующий метод, в котором я использую Boost :: вариант. Я пытаюсь получить значение, основанное на типе T
, Если boost::get<T>
терпит неудачу, я хочу обработать это особым образом, если T является int или unsigned int. Есть ли способ узнать, если T
такое int или unsigned int?
Я не думаю, что я могу использовать специализацию шаблона в этом случае, я могу?
РЕДАКТИРОВАТЬ: Кроме того, у меня еще нет доступа к C ++ 11 (скоро я надеюсь)
template < typename T, typename C, void (C::*setterFcn)(const T&) >
void binder( const Variant& value_var, C* c )
{
const T* typeData = boost::get<T>(&value_var);
if ( NULL == typeData )
{
// Need to check for int or unsigned int here somehow
}
(((C*) c)->*(setterFcn))(*typeData);
}
В C ++ 11 вы можете использовать std::is_same
и в C ++ 03 вы можете сделать что-то вроде этого:
template <typename T1, typename T2>
class is_same
{
public:
static bool const value = false;
};
template <typename T>
class is_same<T, T>
{
public:
static bool const value = true;
};
и использовать его в точности как стандартная версия C ++ 11.
Вы также можете использовать is_same () на boost или на C ++ 11.
Возможно, самый простой способ — просто делегировать перегруженным функциям или шаблонам функций: вы определяете общую обработку, возможно, ничего не делая, в одной функции и специализированную обработку либо в двух отдельных функциях (если дополнительная обработка тривиальна), либо в enable_if
Функция ed с проверкой состояния для int
или же unsigned int
,