auto 之前的概念连接?

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)

其中缺少声明行的概念。

Nic*_*las 7

不,在对推导变量定义的类型应用约束时,无法组合概念。

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声明本身更具可读性。