es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , ,

Answer

  1. Avatar for 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ón requires. Aquí hay un ejemplo de cómo se puede hacer:

    auto g = ...;
    
    requires MutableGraph<decltype(g)> && VertexListGraph<decltype(g)>
    auto h = g;
    

    En este ejemplo, definimos h como una variable que cumple con los conceptos de MutableGraph y VertexListGraph. La palabra clave requires especifica las restricciones que el tipo de g debe cumplir para poder asignarse a h. 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:

    template<typename t="">
    using MutableVertexListGraph = T requires MutableGraph<t> && VertexListGraph<t>;
    
    MutableVertexListGraph auto g = ...;
    

    En este ejemplo, MutableVertexListGraph se define como un alias de plantilla que requiere que T cumpla con los conceptos MutableGraph y VertexListGraph. Esto nos permite utilizar MutableVertexListGraph 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)>

Comments are closed.