Есть ли способ утверждать время компиляции, если переменная является классом, структурой или базовым типом в C ++?
-
06-07-2019 - |
Вопрос
Я пытаюсь реализовать шаблонный класс, который мог бы сказать мне, является ли переменная классом, структурой или базовым типом.
До сих пор я пришел с этим:
template< typename T >
class is_class
{
private:
template< typename X >
static char ( &i_class( void(X::*)() ) )[1];
//
template< typename X >
static char ( &i_class( X ) )[2];
public:
static bool const val = sizeof( i_class< T >(0) ) == 1;
};
и использование:
is_class< int >::val; // false
is_class< some_class_type >::val; // true
Проблема в том, что теперь мне нужно написать пустую функцию void в каждом классе, который можно использовать с этим кодом.
Кто-нибудь знает решение этой проблемы?
Решение
is_class
является членом библиотеки Boost.Type_Traits. Реализация, вероятно, похожа на то, что у вас уже есть. Вы должны использовать совместно с enable_if
для создания функции, если это необходимо:
template <class T>
typename enable_if_c<boost::is_class<T>::value>::type
foo() { }
Или эквивалент:
template <class T>
typename enable_if<boost::is_class<T>>::type
foo() { }
Функция foo
генерируется только в том случае, если тип T
относится к типу класса.
Возвращаемое значение для функции, если оно сгенерировано, является вторым параметром (опущен) в шаблоне enable_if
(по умолчанию void
).
Другие советы
Используйте черты типа boost . р>
Если это утверждение только во время компиляции, вы можете использовать BOOST_STATIC_ASSERT
и Boost.TypeTraits , чтобы проверить, подходят ли типы. Если вы хотите включить шаблон для определенных типов, вы можете добиться успеха, используя Boost's enable_if .