使用 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 {
...
};
我有以下内容(不是为了编译,而是为了有效地说明这个概念)
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 {
...
};