2 Stimmen

Vorlagen von Funktionen

Mir wurde gesagt, dass ich eine Funktionsvorlage erstellen soll, die 4 Argumente aufnehmen soll:

  • Zeiger
  • Referenz
  • Zeiger auf Array
  • Zeiger auf Funktion

Wie ist diese Aufgabe zu erfüllen? Ich habe es versucht:

#include <iostream>
using namespace std;

int nothing(int a)
{
    return a;
}

template<typename T> T func(int *L, int &M, char *K, int (*P)(int))
{
    cout << L << "," << M << "," << K[0] << "," << P() << endl;
    return 0;    
}

int main()
{
    int x = 3;
    int *z = &x;
    int &y = x;
    char c[3];
    int (*pf)(int) = nothing;

    cout << "some result of func" << func(z, y, c, pf) << endl;

    system("pause");
    return 0;
}

Dies ergibt "keine passende Funktion, ich vermute für 'pf'. Auch jetzt habe ich keine Kontrolle über das, was in pf übergeben oder bin ich falsch?

3voto

sbi Punkte 211669

Sie sind fast am Ziel. In C++ wird eine Referenz jedoch mit & (nicht $ ), ein Zeiger auf ein Array ist ein Zeiger auf dessen erstes Element, und ein Funktionszeiger benötigt zusätzliche Klammern: T (*pf)() .

Beachten Sie, dass es sich um eine Funktionsschablone (im Gegensatz zu Klassenvorlagen ).

bearbeiten (Sie sollten Ihre Frage nicht so bearbeiten, dass bisher gegebene Antworten plötzlich unsinnig werden).

pf(x) ruft auf. die Funktion, die in pf . pf 既に es ein Funktionszeiger, also übergeben Sie ihn so wie er ist.
(Auch in Ihrer Erklärung P ist eine Funktion, die eine X , während pf nimmt eine int . Ich nehme an, dass dies ein Bearbeitungsfehler ist.)

Beachten Sie, dass es bei Funktionszeigern 1..N Typen gibt, einen Ergebnistyp und 0..N Argumenttypen. "Erstellen Sie eine Funktionsschablone, die einen Zeiger auf eine Funktion annimmt" kann all das bedeuten. Oder es bedeutet

template< typename F >
void f(F func);

die mit einem beliebigen Funktionszeiger aufgerufen werden kann.

1voto

Gabriel Ščerbák Punkte 17544

Um Ihnen ein wenig mehr zu helfen, versuchen Sie sich daran zu erinnern, wie die "main"-Funktion, die Argumente entgegennimmt, aussieht, dies wird Ihnen helfen zu sehen, wie Sie einen Zeiger auf ein Array erstellen können.

1voto

Georg Fritzsche Punkte 95256

Sie haben jetzt noch einige Probleme...

TYPE (*P)(x) sagt, dass Sie einen Zeiger auf eine Funktion erwarten, die ein Argument des Typs x - in einen bestehenden Typ ändern.

In dem Ausdruck func(z, y, c, pf(x)) Sie versuchen, den Funktionszeiger aufzurufen pf anstatt sie einfach zu übergeben.

Dann rufen Sie func mit Parametern, die auf verschiedenen Typen für die ersten 3 Parameter basieren, int y char aber func erwartet, dass sie auf demselben Typ basieren.
Versuchen Sie aufzuschreiben, mit welchen Arten func aufgerufen wird, und versuchen Sie, diese mit einer Signatur für func avec TYPE mit der Maßgabe, dass int .

Wenn Sie z. B. Folgendes haben:

template<typename T> void f(T* a, T* b);

und versuchen Sie, es so zu nennen:

int* a = 0;
int* b = 0;
f(a, b);

der Compiler instanziiert und ruft eine Funktion auf

void f<int>(int*, int*);

Aber wenn Sie Folgendes tun:

int*  a = 0;
char* b = 0;
f(a, b);

wie soll sie heißen?

void f<int> (int*,  int* ); // doesn't match, 2nd argument is char*
void f<char>(char*, char*); // doesn't match, 1st argument is int*

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