boost :: enable_if с двумя условиями - PullRequest
0 голосов
/ 01 октября 2018

Как вы можете видеть в следующем примере, в настоящее время я использую boost::enable_if в качестве возвращаемого значения функции распределения.Цель состоит в том, чтобы избежать ошибки компиляции для абстрактных типов:

template <typename T>
typename boost::enable_if<boost::is_abstract<T>,T*>::type no_abstract_new()
{
  assert(false);
  return 0;
}

template <typename T>
typename boost::disable_if<boost::is_abstract<T>,T*>::type no_abstract_new()
{
  return new T;
}

Теперь я также хочу исключить классы, унаследованные от собственного класса с именем has_no_default_constructor. Есть ли способ получить or в состоянии boost::enable_if? Что-то вроде этого неправильного кода:

template <typename T>
typename boost::enable_if<boost::is_abstract<T>
                       || boost::is_base_of<has_no_default_constructor,T>,T*>::type default_constructor_new()
{
  assert(false);
  return 0;
}

template <typename T>
typename boost::disable_if<boost::is_abstract<T>
                        || boost::is_base_of<has_no_default_constructor,T>,T*>::type default_constructor_new()
{
  return new T;
}

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

Примечания:

  • Iне используйте C ++ 11 по причине совместимости
  • Я знаю has_default_constructor существует в C ++ 11, но не раньше, чем C ++ 11
  • boost::has_default_constructor существует, но толькопсевдоним boost::has_trivial_constructor если компилируется без C ++ 11

1 Ответ

0 голосов
/ 01 октября 2018

Существует также

template <bool B, class T = void> struct enable_if_c;

, обратите внимание, что в качестве первого параметра принимается bool, а не тип.Следовательно, следующее должно быть в порядке

template <typename T>
typename boost::enable_if_c<boost::is_abstract<T>::value
                       || boost::is_base_of<has_no_default_constructor,T>::value
                       ,T*>::type default_constructor_new()
{
  assert(false);
  return 0;
}

и аналогично для другой перегрузки.

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