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.

Inicialización de estructuras C++ con declaraciones de “If” en línea por variable.

Estoy intentando inicializar una estructura opcional. Me gustaría tener múltiples declaraciones if por variable. Por ejemplo, este es mi código actual:

struct FooBar {
  myObj1 foo;
  std::optional<myObj2> bar;
};

static std::optional<FooBar> globalFoo;

void Set(std::optional<int> x, std::optional<int> y)
{
    if (x && y)
    {
        globalFoot = FooBar{ .foo = {<em>x}, .bar = {</em>y} };
    }
    else if (x && !y)
    {
        globalFoot = FooBar{ .foo = {<em>x} };
    }
    else if (!x && y)
    {
        globalFoot = FooBar{.bar = {</em>y} };
    }
}

Me gustaría simplificar esto de alguna manera a:

void Set(std::optional<int> x, std::optional<int> y)
{
    globalFoot = FooBar{ /* if x.has_value()*/ .foo = {x}, /* if y.has_value() */ .bar = {y} };
}

Estoy abierto a otras sugerencias, sin embargo, la función Set debe tener entradas opcionales y la variable global también debe ser opcional.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para inicializar una estructura opcional con múltiples declaraciones if por variable, se puede utilizar el operador ternario ? para crear una sentencia condicional. Aquí hay un ejemplo:

    void Set(std::optional<int> x, std::optional<int> y)
    {
        globalFoo = FooBar{ x.has_value() ? myObj1{*x} : myObj1{}, y.has_value() ? std::optional<myobj2>{myObj2{*y}} : std::optional<myobj2>{} };
    }
    

    En este código, usamos el operador ternario ? para verificar si x e y tienen valores, e inicializamos foo y bar respectivamente si lo hacen. Si no lo hacen, los inicializamos con valores predeterminados utilizando un par vacío de llaves {}. Esto nos permite simplificar las declaraciones if e inicializar la variable globalFoo con menos líneas de código.

Comments are closed.