pointers

___ answer30749050 ___

Die Frage, die Sie erwähnen, schlägt std :: function vor, betont aber nicht (oder erwähnt überhaupt) ihren Wert, wenn sie mit std :: bind kombiniert wird.

Ihr Beispiel ist das einfachste, aber nehmen Sie an, Sie haben ein

%Vor%

Ein Funktionszeiger kann mehr oder weniger die gleichen Dinge tun. Angenommen, Sie benötigen eine Funktion g (int), die f ist, wobei der zweite Parameter an 0 gebunden ist. Mit Funktionszeigern können Sie nicht viel anfangen, mit der std :: -Funktion können Sie dies tun:

%Vor%     
___ answer30757588 ___
  

Ich möchte auch fragen, ob etwas falsch ist (nicht empfohlen)   Sache mit Funktionszeigern, da ich nie jemanden benutze   sie.

Ja . Funktionszeiger sind schreckliche, schreckliche Dinge. Erstens unterstützen sie nicht, generisch zu sein - also können Sie keinen Funktionszeiger nehmen, der, zum Beispiel, %code% für irgendeine %code% benötigt. Zweitens, sie unterstützen nicht, gebunden zu sein, so dass, wenn irgendjemand in der Zukunft irgendjemand jemals auf einen anderen Staat verweisen möchte, sind sie völlig verschraubt. Dies ist besonders schlimm, da dies %code% für Memberfunktionen enthält.

Es gibt zwei Möglichkeiten, Funktionen in C ++ 11 zu verwenden. Die erste besteht darin, eine Vorlage zu verwenden. Die zweite ist die Verwendung von std :: function.

Die Vorlage sieht irgendwie so aus:

%Vor%

Die Hauptvorteile hier sind, dass es jede Art von Funktionsobjekt akzeptiert, einschließlich Funktionszeiger, Lambda, Funktor, Bindungsergebnis, was auch immer, und F kann eine beliebige Anzahl von Funktionsaufforderungen mit jeder Signatur, einschließlich Vorlagen, haben kann irgendeine Größe mit irgendeinem gebundenen Zustand haben. Es ist also super-flexibel. Es ist auch maximal effizient, da der Compiler den Operator inline und den Status direkt im Objekt übergeben kann.

%Vor%

Der Hauptnachteil hier ist die üblichen Nachteile von Vorlagen - es funktioniert nicht für virtuelle Funktionen und muss in der Kopfzeile definiert werden.

Der andere Ansatz ist %code% . %code% hat viele der gleichen Vorteile - es kann eine beliebige Größe haben, an jeden Status gebunden werden und alles, was aufrufbar ist, aber ein Paar aushandeln. Hauptsächlich wird die Signatur zur Zeit der Typdefinition festgelegt, so dass Sie kein %code% für einige noch zu erkennende %code% haben können, und es kann auch eine dynamische Indirektion / Zuweisung geben (falls möglich). t SBO). Der Vorteil dabei ist, dass %code% ein reeller konkreter Typ ist, den Sie wie bei jedem anderen Objekt weitergeben können, so dass er als virtueller Funktionsparameter und solche Dinge verwendet werden kann.

Grundsätzlich sind Funktionszeiger unglaublich begrenzt und können nichts Interessantes tun und machen die API unglaublich unflexibel. Ihre abscheuliche Syntax ist eine Pisse im Ozean und das Reduzieren mit einem Template-Alias ​​ist urkomisch, aber sinnlos.

    
___ answer30749905 ___
  

Ich habe mir diese Frage angeschaut, konnte aber keine verstehen   Vorteile gegenüber der traditionellen Verwendung von Funktionszeigern. Auch ich würde   gerne fragen, gibt es irgendwas falsches (nicht zu empfehlen) ding mit   Funktionszeiger verwenden, da ich nie jemanden sehe, der sie benutzt.

  • Normale "globale" Funktionen haben normalerweise keinen Status. Während es während des Traversals im funktionalen Programmierparadigma nicht unbedingt gut ist, einen Zustand zu haben, kann manchmal ein Zustand nützlich sein, wenn er sich orthogonal auf das bezieht, was geändert wurde (Heuristik als Beispiel). Hier haben Funktoren (oder Funktionsobjekte) den Vorteil.

  • Normale Funktionen sind nicht sehr gut (Erstellen von Funktionen auf höherer Ebene von Funktionen auf niedrigerer Ebene.

  • Normale Funktionen erlauben es nicht, zusätzliche Parameter im laufenden Betrieb zu binden.

  • Manchmal können normale Funktionen als Ersatz für Lambdas dienen, und umgekehrt, je nach Kontext. Oft möchte man keine spezielle Funktion schreiben, nur weil Sie während des "Container Traversal" eine sehr lokale / spezifische Anforderung haben.

___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123c11 ___ C ++ 11 ist eine 2011 verabschiedete Version des C ++ - Sprachstandards. Sie hat viele Änderungen und Ergänzungen der Kernsprache sowie der verbesserten und erweiterten C ++ - Standardbibliothek vorgenommen. ___ qstntxt ___

Ich habe bisher Funktionszeiger verwendet, wie dieses Format in C ++. Ich habe ab und zu einige Anwendungen und ich frage mich, ob es etwas anderes in c ++ 11/14 als Alternative gibt.

%Vor%

Ich habe mir diese Frage angesehen, konnte sie aber nicht verstehen irgendwelche Vorteile gegenüber der traditionellen Verwendung von Funktionszeigern. Auch ich würde gerne fragen, ob es irgendwas falsches (nicht empfohlenes) Ding mit Funktionszeigern gibt, da ich nie jemanden sehe, der sie benutzt. Oder irgendeine andere alternative Gegenwart.

    
___ answer30750711 ___

Als eine Alternative zu traditionellen Funktionszeigern hat C ++ 11 Vorlagen-Alias ​​ eingeführt in Kombination mit variadischen Vorlagen könnte der Funktionszeiger sintax vereinfacht werden. Im Folgenden ein Beispiel für die Erstellung eines Funktionszeigers "Vorlage":

%Vor%

Es kann so verwendet werden:

%Vor%

Auch kann es gut mit Funktionsüberlastungen umgehen:

%Vor%

Und kann als eine hübsche Methode verwendet werden, Funktionszeigerparameter zu deklarieren:

%Vor%

Dieser Template-Alias ​​könnte als Alternative zu %code% verwendet werden, der weder Nachteile noch Vorteile hat ( gute Erklärung hier) ).

Live-Demo

Kurz gesagt, ich denke, dass Vorlagen-Alias ​​in Kombination mit variadischen Vorlagen eine gute, nette, saubere und moderne C ++ - Alternative zu rohen Funktionszeigern ist (dieser Alias ​​ist immer noch Funktionszeiger), aber %code% ist gut, nett, ordentlich und modern C ++ auch mit guten Vorteilen zu berücksichtigen. Das Einbinden von Funktionszeigern (oder Alias) oder die Auswahl von %code% liegt an Ihren Implementierungsanforderungen.

    
___ tag123pointer ___ Datentyp, der auf einen anderen gespeicherten Wert zeigt. Eine Zeigervariable enthält eine Speicheradresse einer anderen Entität (Variable oder Funktion oder andere Entität). Dieses Tag sollte für Fragen verwendet werden, bei denen Zeiger und keine Referenzen verwendet werden. Die gebräuchlichsten Programmiersprachen, die Zeiger verwenden, sind C-, C ++ -, Go- und Assemblersprachen. Verwenden Sie ein bestimmtes Sprach-Tag. Andere hilfreiche Tags sind Methode, Funktion, Struktur usw., die die Verwendung von Pointer beschreiben. ___ tag123functionpointers ___ Ein Funktionszeiger ist ein Zeiger auf eine Funktion, die in einer Variablen gespeichert werden kann. Es ermöglicht eine Laufzeitauswahl, welche Funktion ausgeführt werden soll. ___ qstnhdr ___ moderne C ++ Alternative zu Funktionszeigern ___
5
Antworten

Ist es legal / wohldefiniertes C ++, eine nicht statische Methode aufzurufen, die nicht über einen Nullzeiger auf Member zugreift?

Ich habe kürzlich folgenden Code gefunden: %Vor% Der Code kompiliert, weil in C ++ Methoden nur Funktionen sind, die implizit einen Zeiger für 'this' übergeben und 'this' wie jeder andere Zeiger auf NULL gesetzt werden kann. Offensichtlich i...
15.07.2010, 15:55
7
Antworten

Kopie eines String-Pointers

Ich habe eine Funktion, die einen Eingang und einen Zeiger auf ein Array von Zeichen in C hat. In dieser Funktion manipuliere ich den Hauptstring, aber ich möchte eine Sicherungskopie in einer anderen Variablen machen, bevor ich sie benutze. Ich...
23.03.2011, 16:57
7
Antworten

pointer als zweites Argument anstatt Zeiger zurückzugeben?

Ich habe bemerkt, dass es in C ein gängiges Idiom ist, einen un malloc ed-Zeiger als zweites Argument zu akzeptieren, anstatt einen Zeiger zurückzugeben. Beispiel: %Vor% Anstelle von %Vor% Was sind die Vor- und / oder Nachteile beider...
26.03.2010, 02:13
1
Antwort

wie man einen indirekten Zeiger in Objective-C wirft

Ich versuche, an meinem Schlüsselbund etwas zu arbeiten und folge diesem Tutorial hier Leider bekomme ich den folgenden Fehler, wenn es darum geht, den Schlüsselbund zu suchen %Vor% So sieht der Code aus %Vor% Jede Hilfe, die den richt...
23.07.2013, 23:48
6
Antworten

C ++ multidimensionale Array-Initialisierung

in C ++ Ich möchte eine Doppelmatrix (zweidimensionales Doppelarray) initialisieren, wie ich es normalerweise ohne Zeiger tun würde: %Vor% Da ich jedoch zurückgeben und es an Funktionen übergeben möchte, brauche ich es als double** -Zeige...
24.08.2010, 07:14
5
Antworten

Auswirkungen der Verwendung eines kaufmännischen Und-Zeichens vor einem Funktionsnamen in C ++?

Gegeben sei das Beispiel: %Vor% Dabei ist m_Label eine private Klassenmitgliedsvariable. Wie ich denke, dass ich es verstehe, gibt diese Funktion einen Verweis auf die Variable m_Label zurück. Was wären die Implikationen davon, dies währe...
22.12.2011, 22:18
1
Antwort

Nil-Schnittstelle in Pointer von etwas in Golang konvertieren?

Im folgenden Codebeispiel schlägt der Versuch, eine nil-Schnittstelle in einen Zeiger von etwas zu konvertieren, mit dem folgenden Fehler fehl: interface conversion: interface is nil, not *main.Node %Vor% Link hier abspielen: Ссылка...
11.05.2015, 07:51
2
Antworten

___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123pointer ___ Datentyp, der auf einen anderen gespeicherten Wert zeigt. Eine Zeigervariable enthält eine Speicheradresse einer anderen Entität (Variable oder Funktion oder andere Entität). Dieses Tag sollte für Fragen verwendet werden, bei denen Zeiger und keine Referenzen verwendet werden. Die gebräuchlichsten Programmiersprachen, die Zeiger verwenden, sind C-, C ++ -, Go- und Assemblersprachen. Verwenden Sie ein bestimmtes Sprach-Tag. Andere hilfreiche Tags sind Methode, Funktion, Struktur usw., die die Verwendung von Pointer beschreiben. ___ tag123vector ___ Ein Vektor ist ein eindimensionales Array: Er enthält Komponenten, auf die mit einem ganzzahligen Index zugegriffen werden kann. In einigen Sprachen kann die Größe eines Vektors nach Bedarf vergrößert oder verkleinert werden, um Elemente hinzuzufügen und zu entfernen, nachdem der Vektor erstellt wurde. Verwenden Sie "Vektorgrafiken" für die grafische Darstellung. Frage zu Vektoren, Zeigern und Iteratoren ___ qstntxt ___

Jungs, ich habe morgen eine Zwischenprüfung, und ich habe mir das Musterblatt angesehen, und ich bin mir über diese Frage nicht sicher. Jede Hilfe wäre willkommen.

Lassen Sie %code% ein %code% sein, so dass jedes Element %code% einen Zeiger auf ein %code% enthält. Wenn %code% ein %code% ist, beantworten Sie die folgenden Fragen:

  1. welcher Typ ist %code% ?
  2. welcher Typ ist %code% ?
  3. welcher Code liefert die Adresse des tatsächlichen %code% ?
  4. Welcher Code liefert die tatsächliche %code% ?
___ answer2862114 ___

%code% ist %code%

%code% ist ein Zeiger auf ein %code%

%code%

%code%

    
___ answer2862113 ___
  

welcher Typ ist %code% ?

%code% hat den Typ %code% , welcher Typ auch immer.

  

welcher Typ ist %code% ?

%code% ist ein %code% ; das heißt, es ist eine Referenz auf das Element in dem Vektor, auf das der Iterator zeigt.

  

Welcher Code liefert die Adresse des tatsächlichen %code% ?

%code% , da die Elemente des Vektors Zeiger auf die %code% s sind und %code% eine Referenz auf das Element im Vektor liefert.

  

Welcher Code liefert die tatsächliche %code% ?

%code% ; das heißt, Sie dereferenzieren den Zeiger, der von %code% erhalten wird, um den Referenten des Zeigers zu erhalten.

    
___

Jungs, ich habe morgen eine Zwischenprüfung, und ich habe mir das Musterblatt angesehen, und ich bin mir über diese Frage nicht sicher. Jede Hilfe wäre willkommen. Lassen Sie v ein vector<Thingie*> sein, so dass jedes Element v[i...
19.05.2010, 00:30
2
Antworten

Warum scheint der Verfall zum Zeiger für das Array-Argument nicht auf sizeof () zu liegen?

Ich habe früher eine Frage gelesen, die aufgrund einer exakten Kopie davon geschlossen wurde. Wenn eine Funktion einen Array-Parameter bestimmter Größe hat, warum wird sie durch einen Zeiger ersetzt? und So finden Sie die 'sizeof' (a...
01.07.2012, 15:42
4
Antworten

Explizit den Wert eines Zeigers festlegen

Ich schreibe eine mex-Datei (mit C ++), die eine Speicheradresse als Eingabe akzeptiert und Daten an dieser Speicheradresse bearbeitet. Da ich gezwungen bin, MATLAB als meine Umgebung zu verwenden, kann mein Programm MATLAB-Datentypen nur als Ei...
08.08.2011, 17:37