使用 mixins 强制模板化基类类型

问题描述

我有以下内容(不是为了编译,而是为了有效地说明这个概念)

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 > 的实例,以便允许上述所有组合和派生类。

所以我有一个带有模板参数 T 的类,它允许所有类型...

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 {
   ...
};