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.

Cómo declarar condicionalmente una variable local basada en un argumento de plantilla.

Me gustaría declarar condicionalmente una variable local en una función, basada en un parámetro bool de plantilla. Entonces, si es verdadero, debería estar allí, de lo contrario no debería estar ahí en el sentido de que no quiero que la variable aloje memoria en el stack o llame a su constructor. También podría ser un tipo básico.

No puedo declararlo dentro del bloque if constexpr porque necesito persistencia entre los usos.
1. Puedo simplemente declarar la variable y agregar [[maybeunused]]. Entonces, ¿existe una optimización del compilador que garantice que no se aloje memoria para la variable?

template <bool T> void foo()
{
[[maybe</em>unused]] SomeLargeClass x;
if constexpr(T)
{
... hacer algo con x
}

<p>... hacer algo sin x</p>

<p>if constexpr(T)
{
... hacer algo más con x
}</p>

<p>}
  1. Intenté reemplazar la declaración con
std::enable<em>if</em>t<T, SomeLargeClass> x;

pero no funciona porque el caso T == false no proporciona un tipo. ¿Por qué esto no es SFINAE?

  1. ¿Tengo alguna otra opción?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución alternativa sería utilizar un puntero a la variable, y solo asignar memoria y construir el objeto si la bandera booleana es verdadera. De esta manera, no se desperdicia memoria si la variable no es necesaria.

    “`
    template
    void foo()
    {
    std::unique_ptr x;
    if constexpr(T)
    {
    x = std::make_unique
    ();
    // hacer algo con x
    }

    // hacer algo sin x
    
    if constexpr(T)
    {
        // hacer algo más con x
    }
    

    }
    “`

Comments are closed.