2012-07-25 4 views
5

Ist es möglich, "Typ der aktuellen struct" innerhalb der struct zu bekommen? Zum Beispiel möchte ich so etwas wie dies zu tun:Wie bekomme ich Informationen über den "aktuellen Typ" innerhalb einer Struktur/Klasse?

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; 
    } 
} 

Ich habe versucht, es so zu tun:

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; 
    } 
} 

aber es sieht hässlich, erfordert die Unterstützung der neuesten C++ Standard und MSVC connot kompilieren Sie es (es stürzt mit "einem internen Fehler" ab).

Eigentlich möchte ich nur einige Präprozessormakros schreiben automatisch generieren Funktionen wie 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); 
} 

Aber ich brauche „Stromart“ innerhalb des Makros kennen.

+1

Warum nicht einfach das Makro GEN_COMPARE_FUNC machen (foobar, x, y) statt? – Rollie

+0

@ForEveR über 'Variadic Macros'. Es wird von GCC und MSVC unterstützt, also ist es genug für mich. – qehgt

+0

Wenn Sie einen bool-Operator in Form eines Templates == 'verwenden, können Sie versehentlich zwei Typen vergleichen, bei denen es nicht sinnvoll ist, dass sie vergleichbar sind. –

Antwort

0

Eigentlich können Sie somethink wie folgt verwenden.

#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); 
}; 

Ich habe keine Ahnung, wie var. Makro Pars auf diese Weise (wir müssen die Params werfen und vergleichen jedes Par aus diesem und von t, ich habe keine Ahnung, wie expandieren Params im Makro).

0

Dieser Stack-Überlauf URL besagt, dass die Boost-Bibliotheken den Typ eines Ausdrucks berechnen kann, aber C/C++ selbst kann nicht:

Getting name and type of a struct field from its object

Jemand auch eine ähnliche Frage gestellt:

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

zu starten typeof gehören die typeof-Headers:

Um den Typ eines Ausdrucks bei der Kompilierung verwenden, um die BOOST_TYPEOF Makro ableiten:

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

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

C++ 11 kann. typedef decltype (1 + 0.5) Typ; – ForEveR

Verwandte Themen