什么相当于概念的铸造
What is the equivalent of cast for concepts?
考虑满足两个概念ConceptA
和ConceptB
的class 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&);
假设NullablePointer
和Iterator
对相关的标准概念执行概念检查,那么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
"子句"之间的相似性。
- 什么相当于 Kotlin 上的C++指针?
- 霓虹灯中的_mm_hadd_ps相当于什么?
- 对于 poco 库来说,Boost_USE_STATIC_LIBS相当于什么?
- 什么 clang-format 相当于 rustfmt 的 indent_style=Block?
- C++ C 的双指针相当于什么?
- Visual Studio 编译器的 record-gcc-switch 相当于什么?
- 什么相当于英特尔实感 3D 摄像头 (SR300) 的 pmdGet3DCoordinates?
- 什么C++相当于winapi的MsgWaitForMultipleObjectsEx
- VB6 相当于 C++ 个字符数组是什么?
- C# 在<map>C++中相当于什么?
- opencv 相当于 matlab 的 fliplr() 是什么?
- C++中 Python 的列表[:x] 相当于什么?
- C++中的“字符串”相当于什么
- 什么相当于C++中的QVariant
- 相当于 Java 静态块的C++习语是什么?
- OSX相当于Linux g++-multilib是什么?
- C中的C++ '*&'相当于什么?它甚至存在吗?
- 德尔福中C++“const”返回类型相当于什么
- 在Tensorflow的C++ TensorShape API中,Python的None相当于什么?
- 输出到字符串的 cout 相当于什么?