Шаблоны С++: как определить, подходит ли тип для подкласса
Скажем, у меня есть некоторый шаблонный класс в зависимости от типа T
. T
может быть почти любым: int
, int*
, pair <int, int>
или struct lol
; это не может быть void
, ссылка или что-то еще cv-квалификационное. Для некоторой оптимизации мне нужно знать, могу ли я подклассом T
. Таким образом, мне нужен некоторый тип признаков is_subclassable
, определяемый как логическая комбинация основных признаков или с помощью некоторых трюков SFINAE.
В исходном примере int
и int*
не являются подклассами, а pair <int, int>
и struct lol
.
EDIT. Как показано ниже, объединения также не являются подклассами, а T
также может быть типом объединения.
Как написать тип признака, который мне нужен?
Ответы
Ответ 1
Вы хотите определить, является ли он неединичным классом. Мне не известно, как это сделать (и boost также не нашел пути). Если вы можете жить с ложными срабатываниями профсоюзных дел, вы можете использовать is_class
.
template<typename> struct void_ { typedef void type; };
template<typename T, typename = void>
struct is_class { static bool const value = false; };
template<typename T>
struct is_class<T, typename void_<int T::*>::type> {
static bool const value = true;
};
Boost имеет is_union
, который использует встроенные компиляторы, хотя и поможет вам здесь. is_class
(который также поддерживает) в сочетании с is_union
решит вашу проблему.