什么相当于概念的铸造

What is the equivalent of cast for concepts?

本文关键字:相当于 什么      更新时间:2023-10-16

考虑满足两个概念ConceptAConceptBclass A。让函数foo重载两个概念:

void foo(ConceptA& arg);
void foo(ConceptB& arg);
A a;
fun(concept_cast<ConceptA>(a));

注意:此示例使用作为 N3701 §5 的一部分提出的"简洁表示法"语法

是否存在类似concept_cast允许用户选择重载的东西?

例如:比方说 ConceptA说 T 必须有一个成员函数bar() ConceptB说 T 必须有一个成员函数baz()并且class A同时具有bar()baz()成员函数

它显然是模棱两可的,但是有没有办法像我们为正常过载static_cast的那样明确选择?

更新:接受的答案已超过2年。c++17 有什么更新吗?

如果其中一个概念是另一个概念的更受约束的版本(例如,满足ConceptA的所有内容也将满足ConceptB,反之亦然),则将选择A满足的最受约束的重载。

如果两个概念都不比另一个概念更受约束,那么这两个概念被认为是模棱两可的重载。鉴于你对这个问题的措辞,我希望你已经知道这一点。

关于concept_cast,我认为目前的提案中没有类似的东西。至少在布里斯托尔会议(13年4月)之前没有。我不希望这种情况发生变化,因为目前的重点似乎是确保概念精简/约束提案的核心是可行的,并为委员会所接受。

可能会有一些明确选择这样的重载模板函数的需求,也许这样的强制转换是正确的事情,但我不太确定。考虑到这样的强制转换对重载消除歧义有用,其中 static_cast 是一个更通用的功能。concept_cast的结果将与重载解析上下文之外的原始值相同!

编辑:查看最新提案(N3701),没有明确指定要实例化的模板函数的规定。

您声称static_cast可用于显式选择"正常"重载的说法是似是而非的。可以用今天的C++写以下内容:

template<typename P, EnableIf<NullablePointer<P>>...>
void foo(P&);
template<typename It, EnableIf<Iterator<It>>...>
void foo(It&);

假设NullablePointerIterator对相关的标准概念执行概念检查,那么int* q; foo(q);没有希望进行编译,因为int*既是NullablePointer模型又是Iterator模型(并且两个概念都不包含另一个)。没有什么明显的static_cast可以帮助解决这种情况。

我的例子(你可以自己测试)是非常相关的,因为这种代码是Concepts Lite试图形式化的。您呈现的重载集等效于:

template<typename A>
    requires ConceptA<A>
void foo(A& arg);
template<typename B>
    requires ConceptB<B>
void foo(B& arg);

请注意requires子句和EnableIf"子句"之间的相似性。