คุณสามารถสร้าง wrapper อื่นรอบ ๆ บัฟเฟอร์ stdout:
#include <iostream>
#include <iomanip>
int main() {
int x = 76;
std::ostream hexcout (std::cout.rdbuf());
hexcout << std::hex;
std::cout << x << "\n"; // still "76"
hexcout << x << "\n"; // "4c"
}
ในฟังก์ชัน:
void print(std::ostream& os) {
std::ostream copy (os.rdbuf());
copy << std::hex;
copy << 123;
}
แน่นอนว่าหากประสิทธิภาพเป็นปัญหาสิ่งนี้จะแพงกว่าเล็กน้อยเนื่องจากเป็นการคัดลอกios
ออบเจ็กต์ทั้งหมด(แต่ไม่ใช่บัฟเฟอร์) รวมถึงบางสิ่งที่คุณจ่ายไป แต่ไม่น่าใช้เช่นโลแคล
ไม่เช่นนั้นฉันรู้สึกว่าถ้าคุณจะใช้.flags()
มันจะดีกว่าที่จะสอดคล้องและใช้.setf()
เช่นกันมากกว่า<<
ไวยากรณ์ (คำถามเกี่ยวกับสไตล์ล้วนๆ)
void print(std::ostream& os) {
std::ios::fmtflags os_flags (os.flags());
os.setf(std::ios::hex);
os << 123;
os.flags(os_flags);
}
อย่างที่คนอื่นบอกคุณสามารถใส่สิ่งที่กล่าวมาข้างต้น (และ.precision()
และ.fill()
แต่โดยทั่วไปแล้วจะไม่ใช่ภาษาที่เกี่ยวข้องกับคำที่มักจะไม่ถูกแก้ไขและหนักกว่า) ในชั้นเรียนเพื่อความสะดวกและเพื่อให้ปลอดภัยเป็นพิเศษ std::ios&
สร้างควรจะยอมรับ