Есть ли способ утверждать время компиляции, если переменная является классом, структурой или базовым типом в C ++? - PullRequest
1 голос
/ 06 мая 2009

Я пытаюсь реализовать шаблонный класс, который мог бы сказать мне, является ли переменная классом, структурой или базовым типом.

Пока я пришел с этим:

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

Кто-нибудь знает решение этой проблемы?

Ответы [ 3 ]

8 голосов
/ 06 мая 2009

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).

0 голосов
/ 06 мая 2009

Если это утверждение только во время компиляции, вы можете использовать BOOST_STATIC_ASSERT и Boost.TypeTraits , чтобы проверить, подходят ли типы. Если вы хотите включить шаблон для определенных типов, вы можете добиться успеха, используя Boost's enable_if .

0 голосов
/ 06 мая 2009

Использовать бустовые черты типа .

...