要求一个指针同时有两个基类

luq*_*qui 2 c++ templates

我有这样的情况。

struct ViewModel {...};
struct Movable : virtual ViewModel {...};
struct Selectable : virtual ViewModel {...};
Run Code Online (Sandbox Code Playgroud)

(这些都是没有数据成员的“接口”类)

有许多类似于Movable和 的子接口Selectable,描述了ViewModel可能有也可能没有的不同功能,以及使用这些功能的相应方法。这个想法是 aViewModel将实现一堆这些。

现在我正在实现一个功能,它需要一个ViewModel既是Movable又是Selectable. 我当然可以

struct MoveSelectable : virtual Movable, virtual Selectable {};
Run Code Online (Sandbox Code Playgroud)

并要求MoveSelectable实施,但这太多了。是否有可能制作一个组合器,这样我就可以在不必引入新类的情况下做到这一点,这样视图模型实现者就不需要知道这种组合?例如,

void selectAndMove(intersection<Movable, Selectable>* viewModel) {...}
Run Code Online (Sandbox Code Playgroud)

max*_*x66 5

也许使用 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)
 { ... }
Run Code Online (Sandbox Code Playgroud)

这样你就有了一个模板函数,它接受每个模板类型T指针,只有在T派生自Moveable 时才启用Selectable