Шаблоны C ++: как определить, подходит ли тип для подклассов - PullRequest
11 голосов
/ 01 июля 2011

Допустим, у меня есть некоторый шаблонный класс в зависимости от типа T.T может быть почти любым: int, int*, pair <int, int> или struct lol;это не может быть void, ссылка или что-либо cv-квалифицированное, хотя.Для некоторой оптимизации мне нужно знать, могу ли я подкласс T.Итак, мне понадобится некоторый тип черты is_subclassable, определяемый как логическая комбинация базовых черт или с помощью некоторых трюков SFINAE.

В исходном примере int и int* не являются подклассами, тогда какpair <int, int> и struct lol являются.

РЕДАКТИРОВАТЬ : Как указывалось ниже, объединения также не подклассифицированы, и T также может иметь тип объединения.

Как мне написать нужный тип черты?

1 Ответ

13 голосов
/ 01 июля 2011

Вы хотите определить, является ли это класс, не являющийся объединением.Я не знаю, как это сделать (и 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 решит вашу проблему.

...