Как вы можете видеть в следующем примере, в настоящее время я использую 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