Ben*_*Ben 2 c++ c++-concepts c++20
我正在学习 C++20 概念。有没有办法在 之前就地进行概念连接auto?例如,如果我有一个MutableGraph<G>概念和一个VertexListGraph<G>概念,我可以定义
template <typename G>
concept MutableVertexListGraph = MutableGraph<G> && VertexListGraph<G>;
Run Code Online (Sandbox Code Playgroud)
并做
MutableVertexListGraph auto g = ...;
Run Code Online (Sandbox Code Playgroud)
但是当我只是希望它对这两个概念进行建模时,命名这个概念是很烦人的。如果我能做到就好了
MutableGraph && VertexListGraph auto g = ...; // && not allowed here.
Run Code Online (Sandbox Code Playgroud)
甚至类似的东西
template <typename T, concept... Concepts> // <- "concept" not allowed here.
concept ModelsAll = (Concepts<T> && ...);
...
ModelsAll<MutableGraph, VertexListGraph> auto g = ...;
Run Code Online (Sandbox Code Playgroud)
我当然可以
MutableGraph auto g = ...;
requires { MutableGraph<decltype(g)>; };
Run Code Online (Sandbox Code Playgroud)
缺乏对称性,或者
auto g = ...;
requires { MutableGraph<decltype(g)>; MutableGraph<decltype(g)>; };
Run Code Online (Sandbox Code Playgroud)
其中缺少声明行的概念。
不,在对推导变量定义的类型应用约束时,无法组合概念。
ConceptName auto variable = ...;是相当可读的。这ConceptName可能是非常不言自明的,并且它为变量定义留下了足够的空间。
Concept1 && Concept2 && Concept3 auto variable = ...;可读性要差很多。此时,概念序列挤出了语句中实际重要的部分:变量声明。因此,将其分成多个语句更有意义:
auto variable = ...;
static_assert(Concept1<decltype(variable)> && Concept2<decltype(variable)> && Concept3<decltype(variable)>);
Run Code Online (Sandbox Code Playgroud)
这涉及到非常不幸的大量decltype使用(附加using语句可以避免),但它确实分离了关注点,使variable声明本身更具可读性。