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

StackOverflow https://stackoverflow.com/questions/828442

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top