2016-10-03 13 views
11

Czy istnieje sposób na stworzenie skróconego aliasu dla następującej linii w C++ 98?Jak utworzyć alias dla operacji wielostrumieniowych?

std::precision(3) << std::fixed 

a następnie użyć aliasu następująco:

std::cout << alias << 3.1415926 << std::endl; 
+5

Czym jest C++ 99? –

+15

@LightnessRacesinOrbit Nowy nadchodzący standard 2099. –

+3

Prawdopodobnie użyjesz '# define'. –

Odpowiedz

22

Standardowy sposób byłoby prawdopodobnie utworzyć własny manipulator

std::ios_base& alias(std::ios_base& str) { 
    str.precision(3); 
    return std::fixed(str); 
} 

wówczas:

std::cout << alias << 3.16464; 

Zobacz Przeciążenie (9) z operator<<:

basic_ostream& operator<<(std::ios_base& (*func)(std::ios_base&)) 

Jeśli chcesz określić argumenty, trzeba struktury pośrednie:

struct alias_t { 
    int n; 
}; 

alias_t setalias(int n) { return {n}; } 

template <class CharT, class Traits> 
std::basic_ostream<CharT, Traits>& 
operator<<(std::basic_ostream<CharT, Traits>& out, const alias_t& alias) { 
    return out << std::fixed << std::setprecision(alias.n); 
} 

// Or if you do not care about genericity: 
std::ostream& operator<<(std::ostream& out, const alias_t& alias) { 
    return out << std::fixed << std::setprecision(alias.n); 
} 

wówczas:

std::cout << setalias(6) << 3.16464; 
+1

Piękna. Dziękuję Ci! – BigBrownBear00

+1

Czy istnieje powód, aby preferować te dwie linie, aby po prostu "zwrócić str << std :: setprecision (3) << std :: naprawiono;'? Mam na myśli funkcjonalnie, a nie stylistycznie. – TartanLlama

+1

@TartanLlama 'str' nie jest tutaj strumieniem, więc to by nie zadziałało. – Holt