2016-09-13 1 views
2

Ich bin völlig neu in C++ und ich frage mich, ob es eine Möglichkeit gibt, n-Funktionen zu definieren, die gleiche Rückgabetyp und Parameter in einer einzigen Zeile in Reihenfolge haben einen DRY-Code pflegen.Definieren Sie mehrere private Funktionen mit der gleichen Rückgabetyp und Parameter in einer Zeile

Ich habe versucht, eine Lösung online und auf SO zu suchen, aber ich konnte keine richtige Antwort finden.

myHeader.h

class MyClass{ 

public: 
    . . . 

private: 
    . . . 
    std::vector<Dcel::Vertex*> addVertices(std::vector <Dcel::Vertex*>); 
    std::vector<Dcel::Vertex*> randomPointsGetter(std::vector<Dcel::Vertex*>); 
}; 

So kehren sie sowohl std::vector<Dcel::Vertex*> Typ und std::vector <Dcel::Vertex*> als Parameter Eingang nehmen.

Ist es möglich, beide oder n Funktionen in derselben Zeile zu definieren? Wenn ja, wie?

Vielen Dank im Voraus.

+1

Nein, es ist nicht möglich. Edit: Sie könnten mit einem Makro schummeln, nehme ich an. – AndyG

+1

Es ist möglich, einen Typalias zu verwenden, der einen Funktionstyp bezeichnet: 'using F = std :: vector (std :: vector ); F addVertices, randomPointsGetter; ', aber benutze es nicht. – cpplearner

+3

Von den Namen gibt es keine inhärente Verbindung zwischen diesen Funktionen, so dass die Tatsache, dass sie die gleiche Schnittstelle haben, keine grundlegende Eigenschaft ist, die dokumentiert und gepflegt werden sollte; es ist einfach ein Zufall. "DRY" ist eine zu starke Vereinfachung; Wiederhole dich nicht, außer wenn du solltest. –

Antwort

2

Wenn die Anzahl der Funktionen wächst, scheint ein Makro angemessen:

class MyClass { 

#define MY_PREFIX_DECL_FN(name) \ 
    std::vector<Dcel::Vertex*> name(std::vector<Dcel::Vertex*>) 

    MY_PREFIX_DECL_FN(addVertices); 
    MY_PREFIX_DECL_FN(randomPointsGetter); 
    MY_PREFIX_DECL_FN(...); 

#undef MY_PREFIX_DECL_FN 

}; 
+0

Die Kombination 'definition' und' typedef' wäre die beste Wahl, oder? Ich meine, für eine ganze Definition wie 'MY_PREFIX_DECL_FN (addVertices);' 'define' ist perfekt, aber für Fälle wie' void buildTetrahedron (VertexPointersList) '' mit 'typedef td :: vector VertexPointersList;' ist sehr gut auch. Recht? – AndreaM16

+1

@ AndreaM16 tatsächlich. Sie können sehr gut den Typedef im Makro verwenden, wenn Sie dies wünschen. – Quentin

+0

Danke @Quentin. – AndreaM16

3

Die Verwendung von typedef hilft, die Duplizierung zu reduzieren, obwohl Sie immer noch nicht mehrere Funktionen in derselben Zeile definieren können.

typedef std::vector<Dcel::Vertex*> VertexList; 

VertexList addVertices(VertexList); 
VertexList randomPointsGetter(VertexList); 
+0

Vielen Dank für Ihre Zeit! – AndreaM16

7

Ist es möglich, beide, oder n-Funktionen in der gleichen Linie zu definieren? Wenn ja, wie?

Alle Leerzeichen werden in C++ gleich behandelt, also sicher. Hier sind zwei in der gleichen Zeile deklarierten Funktionen:

T function(); T another_function(); 

Wenn Sie gemeint, ob Sie mehrere Funktionen in einem Voll Ausdruck erklären könnten, oder „Share“ der Rückgabetyp, dann nein, das ist nicht möglich.


Wenn Sie die Komplexität der wiederholten std::vector<Dcel::Vertex*> nicht mögen, können Sie einen Aliasnamen verwenden:

using R = std::vector<Dcel::Vertex*>; 
R addVertices(R); 
R randomPointsGetter(R); 

Edit: Diese using Erklärung ist semantisch äquivalent mit typedef wie in Josh Kelley Antwort gezeigt.

+0

Vielen Dank für die Erklärung. Grundsätzlich ist die Verwendung von 'using' oder' typedef' ziemlich gleich? – AndreaM16

+1

@ AndreaM16 sie sind genau das Gleiche. Seit C++ 11 steht 'using' syntax zur Verfügung, verwenden Sie also' typedef' wenn Ihr Compiler alt ist. Ich bevorzuge 'using', da es einfacher ist, sich zu erinnern, welches der Typ und welches der Alias ​​ist. – user2079303

+0

Danke @ user2079303. – AndreaM16

1

Ja.

können Sie N Funktionen definieren entweder std::vector oder std::array mit:

std::vector< std::function(std::vector<Dcel::Vertex*>(std::vector <Dcel::Vertex*>)) > my_private_functions; 
std::array< std::function(std::vector<Dcel::Vertex*>(std::vector <Dcel::Vertex*>)),N > my_private_functions; 
+0

Aber diese deklarierten Funktionen wären keine Mitglieder der Klasse. – AndyG

+0

Sie können immer einen Aliasnamen verwenden, z. B. 'auto const & addVertices = my_private_function [0]; auto const & randomPointsGetter = meine_private_funktion [1]; '. Und es sieht so aus, als ob Sie eine Methode einer Instanz dieser Klasse verwenden. –

Verwandte Themen