使用 mixins 强制模板化 base-class 类型

Enforcing templated base-class types with mixins

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

class abstract_mixin {
...
}

template<class X>
class concrete_mixin_A : public abstract_mixin, public X {
...
}

这里,abstract_mixin定义了一族mixins,concrete_mixin_A是该族的一个成员(会有_B_C等)。另外,我有一个 classes 家族,mixin 家族中的任何 mixins 都应该与它们一起使用(即上面的 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 >

现在我有了第三个 classes 家族来操作一个对象。我想将其限制为(从逻辑上讲)符合 abstract_mixin < abstract_mixin_compat > 的实例,以便允许上述所有组合和派生的 classes。

所以我有一个 class 和一个允许所有类型的模板参数 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 {
   ...
};