Шаблоны С++: как определить, подходит ли тип для подкласса

Скажем, у меня есть некоторый шаблонный класс в зависимости от типа 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 решит вашу проблему.