如何测试一个类是否满足C++中的一个概念



在rust中,显式键入impl Trait for Object,这保证了Object将具有此特性。现在C++20概念当然有点通用了,因为它们不是只与一个类型相关,而是可能与多个类型相关。然而,这就引出了一个问题,即如何确定您实现的某些类型实际上满足了某些概念。

现在的概念有点像鸭子,如果你的对象满足了requires块中有人试图用它做的所有事情(它像鸭子一样嘎嘎作响(,那么它就被当作鸭子来满足这个概念。但是有没有办法说:;我希望这类课程能通过测试";?

例如:

class MyClass1 { ... }
class MyClass2 { ... }
template<typename T1, T2>
concept MyConcept = requires(T1 t1, T2 t2) { ... }
static_assert( satisfies<MyConcept, MyClass1, MyClass2>() )

这样的satisfies函数存在吗?如果不存在:如何编写这样的satisfies函数?

一些动机

如果您将对象传递给某个库,其中某些概念的实现是可选的(例如,一个库接受可能位于或不位于边界的组件,并且只对位于边界的对象执行某些计算(,则Ducktypeing可能是不够的。

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

是一个谓词,在编译时进行评估

因此,给定OP的示例,我们可以编写

static_assert(MyConcept<MyClass1, MyClass2>);

最新更新