问题描述
class abstract_mixin {
...
}
template<class X>
class concrete_mixin_A : public abstract_mixin,public X {
...
}
这里,abstract_mixin
定义了一个 mixin 家族,而 concrete_mixin_A
是这个家族的一个成员(会有 _B
、_C
等等)。另外,我有一个类系列,mixin 系列中的任何 mixin 都打算与这些类一起使用(即上面的 X
模板参数:
class abstract_mixin_compat {
}
class concrete_mixin_compat_A : public abstract_mixin_compat {
...
}
class concrete_mixin_compat_B : public abstract_mixin_compat {
...
}
然后我可以做concrete_mixin_A < concrete_mixin_compat_B >
。
现在我有第三类对对象进行操作的类。我想将其限制为(从逻辑上讲)符合 abstract_mixin < abstract_mixin_compat >
的实例,以便允许上述所有组合和派生类。
template < class T >
class DoStuff {
...
do_some_stuff( ... accept all instances ... )
// Possibly also track the instance of T
T t_instance;
}
如何实现这一点,无论是在语法上还是其他方面?
解决方法
是的,这是可能的。
template <template <class> class A,class B>
void mixin_checker(const A<B>&)
requires (std::is_base_of_v<abstract_mixin,A<B>> &&
std::is_base_of_v<abstract_mixin_compat,B>)
{}
template <class T>
concept my_mixin = requires(T t) {
mixin_checker(t);
};
template <my_mixin T>
class DoStuff {
...
};