Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.11.2010, 20:04

[Erledigt] Function Objects als Function Pointer speichern

Hallo

ich speichere Funktionspointer in einer std::map, um eine Funktion mit einem bestimmten Befehl zu verbinden. In dieser wollte ich sowohl normale Funktionen speichern, als auch Function Objects, also Klassen, die sich wie eine Funktion verhalten, indem sie den Funktionsoperator überladen.
Statt einer map von Funktionspointern hätte ich auch eine map von Klassen, die ein entsprechendes Interface implementieren nehmen können, jedoch wollte ich, dass man für komplexere Befehle Klassen und für einfache Befehle eine gewöhnliche Methode verwenden kann.

Der Compiler beschwert sich jedoch, dass das Objekt der Klasse XY nicht in einen Funktionspointer umgewandelt werden kann und mir ist aufgefallen, dass andere Funktionen, die auch Function Objects akzeptieren alle templates sind. Funktioniert mein Ansatz so nicht, oder gibt es da eine andere Möglichkeit?

Vielen Dank im voraus
mfg
ComputerAddict

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ComputerAddict« (22.11.2010, 21:00)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

22.11.2010, 20:11

Es geht, aber ich würde das nicht selbst machen, sondern boost::function benutzen.

Ansonsten wäre Code nicht schlecht..

3

22.11.2010, 20:15

Vielen Dank für die Antwort

der Code wäre wahrscheinlich zu aufwändig zu posten, wegen verschiedener Abstraktionen.

Dieser Testcode funktioniert aber bereits nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef void (*funk) ();
void a(funk test)
{
    test();
}

class B
{
public:
    B(){}

    void operator() ()
    {
        cout << "test";
    }

};

void c()
{
    B b();
    a(b);
}


Der Compiler schreibt folgendes

Quellcode

1
error C2664: 'a': Konvertierung des Parameters 1 von 'B (__cdecl *)(void)' in 'funk' nicht möglich

4

22.11.2010, 20:23

typedef void funk;
Geht das?
Metal ist keine Musik sondern eine Religion.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

22.11.2010, 20:27

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template<class callable>
void a(callable test)
{
    test();
}

class B
{
public:
    B(){}

    void operator() ()
    {
        cout << "test";
    }

};

void c()
{
    B b; // <--- ohne Klammern, sonst ist es eine Funktiondeklaration
    a(b);
}

6

22.11.2010, 20:33

Danke für den Hinweis auf den Fehler mit den Klammern.

Das Problem ist weiterhin, dass du eine Templatefunktion verwendest, was heißt, dass es kein polymorpher Code ist.
Oder anders gesagt, folgenden Code kann ich nicht zu einem Template umschreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
typedef void (*funk) ();
typedef std::map<std::string, funk> MyMap;

void a()
{

}

class B
{
public:
    B(){}

    void operator() ()
    {
        std::cout << "test";
    }

};

void c(funk test)
{
    MyMap map;
    B b;
    map["test"] = a;
    map["test2"] = b;
}



void c()
{
    B b;
    a(b);
}


Ich denke ich werde dann die Boost-funktion verwenden, die du erwähnt hat.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

22.11.2010, 20:57

Wie gesagt. Du kannst hier etwas zu basteln versuchen, oder du benutzt boost::function, was genau das kann, was du brauchst.

8

22.11.2010, 20:59

Mit boost::function funktioniert es.

Vielen Dank für die Hilfe drakon

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

9

23.11.2010, 16:33

Die meisten(alle) aktuellen Compiler haben auch schon den tr1, so dass du statt boost auch std::tr1::function nutzen könntest. Aber wenn du boost schon hast ist es ja egal.

Werbeanzeige