Conjunción de conceptos antes del automóvil.
Estoy aprendiendo los conceptos de C++20. ¿Hay alguna forma de hacer una conjunción de conceptos en su lugar antes de un auto
? Por ejemplo, si tengo un concepto MutableGraph<g>
y un concepto VertexListGraph<g>
, podría definir:
template <typename g="">
concept MutableVertexListGraph = MutableGraph<g> && VertexListGraph<g>;
y hacer:
MutableVertexListGraph auto g = ...;
pero es molesto tener que nombrar el concepto cuando lo que quiero es que el objeto modela ambos conceptos. Sería bueno si pudiera hacer:
MutableGraph && VertexListGraph auto g = ...; // && no permitido aquí.
o incluso algo así como:
template <typename t,="" concept...="" concepts=""> // <- "concept" no permitido aquí.
concept ModelsAll = (Concepts<t> && ...);
...
ModelsAll<mutablegraph, vertexlistgraph=""> auto g = ...;
Por supuesto, puedo hacer:
MutableGraph auto g = ...;
requires { MutableGraph<decltype(g)>; };
que carece de simetría, o
auto g = ...;
requires { MutableGraph<decltype(g)>; MutableGraph<decltype(g)>; };
que carece del concepto en la línea de declaración.</decltype(g)></decltype(g)></decltype(g)></mutablegraph,>
davy.ai
Sí, es posible realizar una conjunción de conceptos en el lugar antes de un
auto
en C++20. Una forma de lograr esto es mediante el uso de una expresiónrequires
. Aquí hay un ejemplo de cómo se puede hacer:En este ejemplo, definimos
h
como una variable que cumple con los conceptos deMutableGraph
yVertexListGraph
. La palabra claverequires
especifica las restricciones que el tipo deg
debe cumplir para poder asignarse ah
. Al usar&&
para separar las restricciones, estamos realizando una conjunción de conceptos.Tenga en cuenta que, dado que
requires
es una expresión, esta técnica se puede utilizar en cualquier lugar donde se permita una expresión. Esto incluye listas de parámetros para plantillas de funciones, plantillas de clases y definiciones de conceptos.Otra forma de lograr esto es mediante el uso de un alias de plantilla con una cláusula
requires
:En este ejemplo,
MutableVertexListGraph
se define como un alias de plantilla que requiere queT
cumpla con los conceptosMutableGraph
yVertexListGraph
. Esto nos permite utilizarMutableVertexListGraph
como una forma abreviada para la conjunción de estos conceptos.Tenga en cuenta que ambas técnicas requieren el uso de la palabra clave
requires
, que es nueva en C++20.</decltype(g)></decltype(g)>