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.

Eres un traductor de español que traduce documentos de TI. Traduce lo siguiente al español. Ignora el especificador ‘long’ para tipos personalizados en c++

Tengo una clase de tipo y una plantilla de clase.

#ifdef USE_QUAD
using hybrid = __float128;
#else
using hybrid = double;
#endif

template
struct Time {
int day;
long T dayFraction; // Este es un ejemplo, necesito ambos aquí, T y long T;
};

Y para complicar las cosas: una clase anidada.

template
struct State {
Time time;
std::vector position;
}

Ahora quiero usar la clase en mi código como hybrid y double simultáneamente, como

State stateH; // a veces se necesita precisión
State stateD; // nunca se necesita precisión

y dejar que el preprocesador se encargue de lo que se supone que debe ser hybrid.

Sin embargo, el código se compila perfectamente si hybrid = double, pero no tanto si hybrid = __float128, debido a long T dayFraction; en la clase Time.

¿Hay una solución alternativa para definir un alias como

using long __float128 = float128;

?

Tenía una solución alternativa definiendo un longHybrid como:

#ifdef USE_QUAD
using hybrid = __float128;
using longHybrid = __float128;
#else
using hybrid = double;
using longHybrid = long double;
#endif

Pero enviar dos parámetros de plantilla afectaría un poco de código y se siente un poco redundante.
Me encantaría escuchar cualquier idea.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución alternativa para el problema con la declaración del long T en la clase Time sería usar un tipo de característica para definir condicionalmente el tipo de dayFraction basado en el tipo de T.

    Por ejemplo, podríamos definir una característica de tipo llamada DayFractionType, que toma un parámetro de plantilla que representa el tipo de T y proporciona un alias de tipo anidado llamado type que representa el tipo de dayFraction en la clase Time:

    template<typename t="">
    struct DayFractionType {
        using type = long;
    };
    
    template<>
    struct DayFractionType<__float128> {
        using type = __int128;
    };
    

    El caso por defecto para la característica de tipo DayFractionType es usar long como el tipo de dayFraction para todos los tipos de T excepto __float128. Para __float128, definimos una especialización que usa __int128 como el tipo de dayFraction en su lugar.

    Entonces podemos modificar la clase Time para usar la característica de tipo DayFractionType para definir el tipo de dayFraction:

    template<typename t="">
    struct Time {
        int day;
        typename DayFractionType<t>::type dayFraction;
    };
    

    De esta manera, cuando usamos State<hybrid>, el tipo de dayFraction en la clase Time se establecerá automáticamente en __int128, lo que nos permite usar __float128 como el tipo de hybrid.

    Con este enfoque, no necesitamos definir un alias de tipo separado como long __float128, y todavía podemos usar la misma plantilla de clase State tanto para tipos double como __float128.

Comments are closed.