我有这样的情况。
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)
也许使用 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。
| 归档时间: |
|
| 查看次数: |
42 次 |
| 最近记录: |