2012-07-25 11 views
5

¿Es posible obtener "tipo de la actual struct" dentro de struct? Por ejemplo, quiero hacer algo como esto:¿Cómo obtener información sobre el "tipo actual" dentro de una estructura/clase?

struct foobar { 
    int x, y; 

    bool operator==(const THIS_TYPE& other) const /* What should I put here instead of THIS_TYPE? */ 
    { 
    return x==other.x && y==other.y; 
    } 
} 

Traté de hacerlo de esta manera:

struct foobar { 
    int x, y; 

    template<typename T> 
    bool operator==(const T& t) const 
    { 
    decltype (*this)& other = t; /* We can use `this` here, so we can get "current type"*/ 
    return x==other.x && y==other.y; 
    } 
} 

pero se ve feo, requiere el apoyo de la última C++ estándar, y connot MSVC compilarlo (se bloquea con "un error interno").

En realidad, sólo quiero escribir algunas macros del preprocesador para generar automáticamente funciones como operator==:

struct foobar { 
    int x, y; 
    GEN_COMPARE_FUNC(x, y); 
} 

struct some_info { 
    double len; 
    double age; 
    int rank; 
    GEN_COMPARE_FUNC(len, age, rank); 
} 

Pero necesito saber "tipo actual" dentro de la macro.

+1

¿Por qué no hacer que su macro GEN_COMPARE_FUNC (foobar, x, y) en su lugar? – Rollie

+0

@ForEveR a través de 'Variadas macros'. Es compatible con GCC y MSVC, por lo que es suficiente para mí. – qehgt

+0

Al utilizar un operador de bool con plantilla == ', puede hacer accidentalmente la posibilidad de comparar dos tipos en los que no tiene sentido que sean comparables. –

Respuesta

0

En realidad, puede utilizar algo así como esto.

#define GEN_COMPARE_FUNC(type, x, y)\ 
template<typename type>\ 
bool operator ==(const type& t) const\ 
{\ 
    return this->x == t.x && this->y == t.y;\ 
} 

struct Foo 
{ 
    int x, y; 
    GEN_COMPARE_FUNC(Foo, x, y); 
}; 

No tengo ni idea, cómo usar var. macro-pars de esta manera (tenemos que ir a lanzar los params y comparar cada par de esto y de t, no tengo idea, cómo expandir params en macro).

0

Esta URL pila desbordamiento establece que las bibliotecas Boost puede calcular el tipo de una expresión, pero C/C++ por sí sola no puede:

Getting name and type of a struct field from its object

Alguien hizo una pregunta similar también:

How can I add reflection to a C++ application?

para empezar a utilizar typeof typeof incluyen el encabezado:

#include <boost/typeof/typeof.hpp> 

para deducir el tipo de una expresión en tiempo de compilación utilizar la macro BOOST_TYPEOF:

namespace ex1 
{ 
    typedef BOOST_TYPEOF(1 + 0.5) type; 

    BOOST_STATIC_ASSERT((is_same<type, double>::value)); 
} 
+0

C++ 11 lata typedef decltype (1 + 0.5) tipo; – ForEveR

Cuestiones relacionadas