2016-10-19 5 views
5

neue Im zu C++, also die endl verwendet wird, um die Linie alsWelcher Typ einer Funktion ist endl? Wie definiere ich etwas wie endl?

cout << "Hello" << endl; 

Meine Forschung rund um das Web zu beenden mir sagt, es ist eine Funktion, wenn es so, warum können wir es ohne die „() aufrufen "

Wie kann ich eine Funktion wie das zu erklären, nehmen wir an, ich eine Funktion machen wollen, die aufräumt nur die Konsole jedes Mal wenn ich für die Eingabe fragen als

string ain() 
{ 
    return " : ?"; 
} 

jetzt statt diese jedes Mal zu verwenden, wie diese

cout << "Whats your name " << ain(); 

ich möchte es als

cout << "Question " << ain; 

zu verwenden, um der Lage sein, einfach So wie es ist, weiß ich, "()" ist nicht viel und das macht nicht wirklich viel, um eine Tonne Zeit zu sparen, aber ich stelle diese Frage grundsätzlich, um herauszufinden, warum Endl das tun kann.

+1

* "warum können wir es ohne die Verwendung der"(); "" * Sie nennen es nicht. 'std :: ostream :: operator <<' tut (die Überladung, die einen Funktionszeiger als Parameter nimmt, Nummer (9), (10) oder (11) [hier] (http://en.cppreference.com/ w/cpp/io/basic_ostream/operator_ltlt)). Damit dies funktioniert, muss die Funktion eine der spezifischen Signaturen haben. ['std :: endl'] (http://en.cppreference.com/w/cpp/io/manip/endl) ist zufällig einer von denen. –

+0

Und bitte beachten Sie, dass 'std :: endl' selten benötigt wird, obwohl es weit verbreitet ist. '\ n'' beendet eine Zeile, ohne die zusätzlichen Sachen zu machen, die' std :: endl' tut. –

Antwort

9

Per cppreference endl ist eine Funktion Vorlage mit dem folgenden Prototyp:

template< class CharT, class Traits > 
std::basic_ostream<CharT, Traits>& endl(std::basic_ostream<CharT, Traits>& os); 

std::ostream ‚s operator<< überlastet ist, zu nennen es auf es zu sehen.

Sie können eine ähnliche Vorlage selbst definieren:

template< class CharT, class Traits > 
std::basic_ostream<CharT, Traits>& foo(std::basic_ostream<CharT, Traits>& os) 
{ 
    return os << "foo!"; 
} 

Nun wird drucken

cout << foo << endl; 

Ausführung foo! zum Standardausgang.

4

std::ostream hat eine Memberfunktion Überlastung

std::ostream& operator<<(std::ostream& (*func)(std::ostream&)); 

Das heißt, Sie

std::cout << ain; 

wenn ain als deklariert verwenden können:

std::ostream& ain(std::ostream& out); 

Seine Umsetzung so etwas wie wäre:

std::ostream& ain(std::ostream& out) 
{ 
    return (out << " : ?"); 
} 
Verwandte Themen