Шаблонная специализация для типов, обеспечивающих класс черт - PullRequest
5 голосов
/ 02 июля 2011

У меня есть класс

template <typename T> struct Dispatch;

, который используется для вызова функции, специфичной для типа.Например, предположим, что у меня есть диспетчеры типа

template <> struct Dispatch <MyClass> {
  static void Apply (void* a, MyClass& m)
  {
      ::memcpy (a, &m, sizeof (m));
  }
};

. Теперь у меня есть группа классов, для которых у меня есть черта типа ArrayTypes.Я хотел бы сделать что-то вроде:

 template <> struct Dispatch <enable_if<IsArrayType>>
 {
   template <typename ArrayType>
   static void Apply (void* a, ArrayType& m)
   {
     ::memcpy (a, &m, ArrayTypeTraits<ArrayType>::GetSize (m));
   }
 };

Возможно ли это?

Ответы [ 4 ]

4 голосов
/ 02 июля 2011

Только что нашел:

template <typename T, class Enable = void> struct Dispatch;
template <typename T>
struct Dispatch<T, typename boost::enable_if< typename IsArrayType<T>::type>::type>
{
};

Благодаря Корнелу.

4 голосов
/ 02 июля 2011

Использовать повышение enable_if .

Если повышение недоступно, проверьте enable_if идиома .

0 голосов
/ 28 июня 2018

Начиная с C ++ 14 это стандартизировано как std::enable_if.

0 голосов
/ 02 июля 2011

Идея, лежащая в основе признаков, заключается в том, что вы можете предоставить реализацию по умолчанию, а типы могут по желанию специализироваться на этом. Таким образом, у вас нет особых случаев в коде, который использует черты. Ваш подход (наличие особых случаев для классов с определенными признаками и без них) побеждает назначение признаков типа.

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