2016-10-19 10 views
5

Im nowe do C++, więc endl jest używany, aby zakończyć linię jakoJakim typem funkcji jest endl? Jak zdefiniować coś takiego jak endl?

cout << "Hello" << endl; 

Moje badania po internecie mówi mi, że jest to funkcja, jeśli jest tak dlatego możemy nazwać bez użycia „() ; "

jaki sposób zadeklarować funkcję takiego, załóżmy, chcę zrobić funkcję, która po prostu porządkuje się na każdym razem konsoli proszę o wejście jak

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

teraz zamiast korzystać z tego za każdym razem jak to

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

Chcę, aby móc używać go jako

cout << "Question " << ain; 

Wystarczy jak endl, wiem, że "()" to niewiele, a to naprawdę nie robi nic wielkiego, aby zaoszczędzić mnóstwo czasu, ale w zasadzie zadaję to pytanie, aby dowiedzieć się, dlaczego Endl może to zrobić.

+1

* "dlaczego możemy to nazwać bez użycia"(); "" * Nie nazywasz tego. 'std :: ostream :: operator <<' robi (przeciążenie, które przyjmuje wskaźnik funkcji jako parametr, numer (9), (10) lub (11) [tutaj] (http://en.cppreference.com/ w/cpp/io/basic_ostream/operator_ltlt)). Aby to działało, funkcja musi mieć jeden ze specyficznych podpisów; ['std :: endl'] (http://en.cppreference.com/w/cpp/io/manip/endl) jest jednym z nich. –

+0

Należy zauważyć, że 'std :: endl' jest rzadko potrzebny, mimo że jest szeroko stosowany. '' \ n'' kończy linię, nie robiąc dodatkowych rzeczy, które robi 'std :: endl'. –

Odpowiedz

9

Zgodnie cppreference endl jest szablonem funkcji z następującym prototypie:

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

std::ostream „s operator<< jest przeciążony to nazwać po obejrzeniu go.

można zdefiniować podobny szablon siebie:

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

Teraz wykonywania

cout << foo << endl; 

wypisze foo! na standardowe wyjście.

4

std::ostream ma przeciążenia funkcji członek

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

Oznacza to, że można użyć

std::cout << ain; 

jeśli ain jest zadeklarowana jako:

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

Jego realizacja będzie coś podobnego:

std::ostream& ain(std::ostream& out) 
{ 
    return (out << " : ?"); 
} 
Powiązane problemy