【发布时间】:2021-07-28 02:33:28
【问题描述】:
在 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 函数?
一些动机
如果你将你的对象传递给一个库,其中某些概念的实现是可选的(例如,一个库接受可能位于或可能不位于边界的组件并且只对位于边界的对象执行某些计算,那么 Ducktyping 可能还不够)。
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);
然后弄清楚为什么这个库不认为你满足某些概念会很烦人。如果出现合理的数据,甚至可能无法检测到。
【问题讨论】:
-
static_assert(MyConcept<MyClass1, MyClass2>);有什么问题? -
@Bob__ facepalm - 我猜什么都没有?找不到那个。将其发布为答案,我会接受。
标签: c++ c++20 c++-concepts static-typing duck-typing