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.

Conceptos de C++20 utilizando ADL con dependencia circular.

Tengo un problema con los conceptos que utilizan ADL.

edit 1: Menciono ADL ya que se supone que las funciones “parse” deben estar sobrecargadas con tipos definidos por el usuario.

El concepto “from_string_view_parsable” no ve las funciones “parse” a continuación, ya que ADL no se aplica a ellas.

Las funciones necesitarían estar definidas o declaradas anticipadamente antes de la definición del concepto, sin embargo, con la segunda sobrecarga hay una dependencia circular, por lo que no se puede hacer.

https://godbolt.org/z/frn1jKv5E
“`c++

#include <sstream>
#include <optional>

template <typename t="">
concept from_string_view_parsable = requires(std::string_view sv, T& x) {
{ parse(sv, x) };
};

void parse(std::string_view input, int& out)
{
auto ss = std::stringstream{};
ss << input;
ss >> out;
}

template <from_string_view_parsable t="">
requires std::default_initializable<t>
void parse(std::string_view input, std::optional<t>& out)
{
out = T{};
parse(input, *out);
}

template <from_string_view_parsable t="">
void use_parse(T& t) {
parse("123", t);
}

int main() {
std::optional<int> x;
use_parse(x);
}
“`

¿Lo que estoy intentando hacer es fundamentalmente incorrecto o tal vez hay alguna solución alternativa que me permita hacerlo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con la dependencia circular está dificultando la definición o la declaración anticipada de las funciones necesarias antes de la definición del concepto. Aunque esto pueda ser un obstáculo, existen posibles soluciones alternativas a este problema.

    Una solución potencial podría ser utilizar un archivo de encabezado separado que contenga las declaraciones/definiciones de las funciones necesarias, lo cual permitiría una declaración anticipada más fácil y evitaría la dependencia circular. Otra solución podría ser utilizar la especialización de plantillas para definir la función de análisis de manera diferente según el argumento de tipo que se pase, en lugar de sobrecargar la función.

    También es importante tener en cuenta que, según la definición actual del concepto from_string_view_parsable, es posible que en realidad no se requiera el uso de la ADL (Argument-Dependent Lookup). Si cambia la definición del concepto para simplemente requerir la existencia de una función de análisis que tome una string_view y un T, el concepto aún debería cumplirse con cualquier función de análisis válida, incluso si no depende de ADL.

Comments are closed.