Требовать, чтобы указатель имел два базовых класса одновременно - PullRequest
2 голосов
/ 19 марта 2020

У меня такая ситуация.

struct ViewModel {...};
struct Movable : virtual ViewModel {...};
struct Selectable : virtual ViewModel {...};

(Это все "интерфейсные" классы без элементов данных)

Существует много подчиненных интерфейсов, подобных Movable и Selectable, описывающие различные функции, которые ViewModel могут иметь или не иметь, с соответствующими методами для работы с этими функциями. Идея состоит в том, что ViewModel будет реализовывать кучу из них.

Теперь я реализую функцию, которая нуждается в ViewModel, который равен Movable и Selectable. Конечно, я мог бы

struct MoveSelectable : virtual Movable, virtual Selectable {};

И потребовать, чтобы MoveSelectable также был реализован, но это слишком много. Можно ли создать комбинатор так, чтобы я мог делать это без введения нового класса, чтобы разработчику модели представления не нужно было знать об этой комбинации? Например,

void selectAndMove(intersection<Movable, Selectable>* viewModel) {...}

1 Ответ

5 голосов
/ 19 марта 2020

Возможно использование SFINAE

template <typename T>
std::enable_if_t<std::is_base_of_v<Movable, T>
              && std::is_base_of_v<Selectable, T>> selectAndMove (T * vm)
 { ... }

Таким образом, у вас есть функция шаблона, которая принимает каждый тип шаблона T указатель , но включается только в том случае, если T происходит от Moveable и Selectable.

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