如何测试 class 是否满足 C++ 中的概念?
How to test if a class satisfies a concept in C++?
在 rust 中显式输入 impl Trait for Object
保证 Object
将具有此特征。现在 C++20 concepts 当然更通用一些,因为它们不仅与一种类型相关联,而且可能与多种类型相关联。然而,这引出了一个问题,即人们将如何确定您实现的某些类型实际上满足某些概念。
现在的概念有点像鸭子,如果你的对象在 requires
块中满足某人试图用它做的所有事情(它像鸭子一样嘎嘎叫),那么它就会像鸭子一样通过并满足概念。但是有没有办法说:“我希望这 类 的分类通过测试”?
例如,这可能看起来像这样:
class MyClass1 { ... }
class MyClass2 { ... }
template<typename T1, T2>
concept MyConcept = requires(T1 t1, T2 t2) { ... }
static_assert( satisfies<MyConcept, MyClass1, MyClass2>() )
是否存在这样的 satisfies
函数,如果不存在:如何编写这样的 satisfies
函数?
一些动机
如果你将你的对象传递给一个库,其中某些概念的实现是可选的(例如,一个库接受可能位于也可能不位于边界的组件并且只对位于边界的对象执行某些计算)边界)。
template <typename GeneralComponent>
void do_something_optionally(GeneralComponent component) {
if constexpr ( satisfies<isBorder, GeneralComponent>() ) {
do_border_calculation(component);
} else {
// don't do border calculation
}
}
do_border_calculation(isBorder auto& parameter);
然后弄清楚为什么这个库不认为你满足某些概念会很烦人。如果出现合理的数据,它甚至可能不会被检测到。
一个concept
is a predicate, evaluated at compile time
因此,根据 OP 的示例,我们可以编写
static_assert(MyConcept<MyClass1, MyClass2>);
在 rust 中显式输入 impl Trait for Object
保证 Object
将具有此特征。现在 C++20 concepts 当然更通用一些,因为它们不仅与一种类型相关联,而且可能与多种类型相关联。然而,这引出了一个问题,即人们将如何确定您实现的某些类型实际上满足某些概念。
现在的概念有点像鸭子,如果你的对象在 requires
块中满足某人试图用它做的所有事情(它像鸭子一样嘎嘎叫),那么它就会像鸭子一样通过并满足概念。但是有没有办法说:“我希望这 类 的分类通过测试”?
例如,这可能看起来像这样:
class MyClass1 { ... }
class MyClass2 { ... }
template<typename T1, T2>
concept MyConcept = requires(T1 t1, T2 t2) { ... }
static_assert( satisfies<MyConcept, MyClass1, MyClass2>() )
是否存在这样的 satisfies
函数,如果不存在:如何编写这样的 satisfies
函数?
一些动机
如果你将你的对象传递给一个库,其中某些概念的实现是可选的(例如,一个库接受可能位于也可能不位于边界的组件并且只对位于边界的对象执行某些计算)边界)。
template <typename GeneralComponent>
void do_something_optionally(GeneralComponent component) {
if constexpr ( satisfies<isBorder, GeneralComponent>() ) {
do_border_calculation(component);
} else {
// don't do border calculation
}
}
do_border_calculation(isBorder auto& parameter);
然后弄清楚为什么这个库不认为你满足某些概念会很烦人。如果出现合理的数据,它甚至可能不会被检测到。
一个concept
is a predicate, evaluated at compile time
因此,根据 OP 的示例,我们可以编写
static_assert(MyConcept<MyClass1, MyClass2>);