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