Проверьте, определяет ли аргумент шаблона имя определенного типа - PullRequest
2 голосов
/ 15 марта 2011

Предположим, у меня есть шаблонный класс, подобный этому:

template<typename T>
class Foo {};

И такой класс:

class PossibleArg
{ typedef int required_type; }

Можно ли написать static_assert в классе Foo, который проверяет, T:: требуемый_тип определен?

Ответы [ 4 ]

3 голосов
/ 15 марта 2011

Может быть, что-то выглядит так:

template <typename T>
class Foo {
  static_assert(sizeof(T::required_type) > 0, "Never shows up");
};

РЕДАКТИРОВАТЬ: Другой способ: SFINAE

template <typename T>
struct has_required_type
{
  typedef char yes[1];
  typedef char no[2];

  template <typename C>
  static yes& test(typename C::required_type*);

  template <typename>
  static no& test(...);

  static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

template <typename T>
class Foo {
  static_assert(has_required_type<T>::value, "Hasn't required type");
};
2 голосов
/ 15 марта 2011

Если ваша цель - получить ошибку компилятора, если у T нет требуемого типа, вы можете просто определить его в Foo. Или я что-то упустил?

template<typename T>
class Foo {
  typedef typename T::required_type T_required_type;
};
2 голосов
/ 15 марта 2011

Вы можете использовать BOOST_MPL_HAS_XXX_TRAIT_DEF , в Boost.MPL:

BOOST_MPL_HAS_XXX_TRAIT_DEF( required_type )

BOOST_MPL_ASSERT(( has_required_type< PossibleArg > ));

BOOST_MPL_HAS_XXX_TRAIT_DEF является макросом, принимающим в качестве параметра имя xxx, которое генерирует метафункцию has_xxx< T >, которая оценивается как true, если T определяет вложенный тип с именем xxx.

(Обратите внимание, что метафункция MPL - это функция времени компиляции, доступ к которой можно получить с помощью ::type. Результатом в этом случае является логическая константа времени компиляции (т. Е. bool_ .)

0 голосов
/ 15 марта 2011

Если вы на самом деле ищете static_assert, здесь есть нечто похожее - Статическое утверждение без повышения или C ++ 0x

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...