19

考虑 aclass A满足两个概念ConceptAConceptB。让一个函数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有什么更新吗?

4

2 回答 2

4

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

如果两个概念都没有比另一个更受约束,那么这两个被认为是模棱两可的重载。鉴于您如何表达这个问题,我希望您已经知道这一点。

关于concept_cast,我认为目前的提案中没有类似的内容。至少在布里斯托尔会议上(2013 年 4 月)没有。我预计这不会改变,因为目前的重点似乎是确保概念精简/约束提案的核心是可行的并且委员会可以接受。

可能会有一些明确选择像这样的重载模板函数的需求,也许这样的转换是正确的,但我不太确定。考虑到这样的强制转换仅对重载消歧有用,其中 asstatic_cast是更一般的特征。的结果concept_cast将与重载决议上下文之外的原始值相同!

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

于 2013-09-06T21:40:15.350 回答
1

您声称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*它既是模型又是模型NullablePointerIterator并且两个概念都不包含另一个)。在这种情况下没有什么明显可以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“从句”之间的相似性。

于 2013-09-07T03:31:20.113 回答