3 Stimmen

Wie kann ich die Template-Spezialisierung verwenden, um die Argumenttypen von Member-Funktionen etc. zu finden?

Ich bin sicher, dass ich das schon einmal beschrieben gesehen habe, kann es aber ums Verrecken nicht mehr finden.

Angenommen, ich habe eine Klasse mit einer Membefunktion irgendeiner Form, z.B.:

int Foo::Bar(char, double)

Wie kann ich ein Template und verschiedene Spezialisierungen verwenden, um die Bestandteile der Typen abzuleiten, z.B.:

template
struct Types;

// Spezialisierung für Membefunktion mit 1 Argument
template
struct Types
{
    typedef RetType return_type;
    typedef ClassType class_type;
    typedef MemFunc mem_func;
    typedef Arg0 argument_0;
    usw...
};

// Spezialisierung für Membefunktion mit 2 Argumenten
template
struct Types
{
    typedef RetType return_type;
    typedef ClassType class_type;
    typedef MemFunc mem_func;
    typedef Arg0 argument_0;
    typedef Arg0 argument_1;
    usw...
};

So dass, wenn ich Types mit meiner oben genannten Membefunktion instanziiere, z.B.:

Types<&Foo::Bar>

es sich zur richtigen Spezialisierung auflöst und die relevanten typedefs deklariert?

Bearbeiten:

Ich spiele gerade mit schnellen Delegaten mit dem Rückruf statisch an eine Membefunktion gebunden.

Ich habe das folgende Konzept, von dem ich glaube, dass es statisch an die Membefunktion gebunden ist:

#include 

template
struct cb
{
    cb( class_t *obj_ )
        : _obj(obj_)
    { }

    void operator()()
    {
      (_obj->*mem_func_t)();
    }

    class_t *_obj;
};

struct app
{
  void cb()
  {
    std::cout << "hello world\n";
  }
};

int main()
{
  typedef cb < app, &app::cb > app_cb;

  app* foo = new app;
  app_cb f ( foo );
  f();
}

Wie kann ich dies jedoch als Spezialisierung in der oben genannten Art und Weise erhalten?

4voto

kennytm Punkte 488916

Sie haben es fast, bis auf das zusätzliche MemFunc, das nicht Teil des Typs ist.

template
struct Types   // <-- kein MemType
{
    typedef RetType return_type;
    typedef ClassType class_type;
//  typedef MemFunc mem_func;     // <-- entfernen Sie diese Zeile
    typedef Arg0 argument_0;
};

Trotzdem können Sie nicht verwenden

Types<&Foo::Bar>

weil Foo::Bar ein Memberfunktionszeiger ist, nicht der Typ davon. Sie benötigen einige Compiler-Erweiterungen, um den Typ in C++03 zu erhalten, z.B. typeof in gcc oder Boost.Typeof:

Types

oder machen Sie ein Upgrade auf C++11 und verwenden Sie das Standard decltype:

Types

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X