ฉันใช้ห้องสมุดภายในที่ถูกออกแบบมาเพื่อเลียนแบบเสนอห้องสมุด C ++และในช่วงไม่กี่ปีที่ผ่านมาผมเห็นอินเตอร์เฟซที่เปลี่ยนจากการใช้เพื่อstd::string
string_view
ดังนั้นฉันจึงเปลี่ยนรหัสตามหน้าที่ให้สอดคล้องกับอินเทอร์เฟซใหม่ น่าเสียดายที่สิ่งที่ฉันต้องผ่านคือพารามิเตอร์ std :: string และสิ่งที่เป็นค่าส่งคืน std :: string ดังนั้นรหัสของฉันเปลี่ยนจากสิ่งนี้:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
ถึง
void one_time_setup(const std::string & p1, int p2) {
api_class api;
const std::string p2_storage(special_number_to_string(p2));
api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size()));
}
ฉันจริงๆไม่เห็นสิ่งที่เปลี่ยนแปลงนี้ซื้อฉันเป็นลูกค้าของ API นอกเหนือจากรหัสอื่น ๆ (ที่จะเป็นไปได้กรูขึ้น) การเรียก API นั้นปลอดภัยน้อยกว่า (เนื่องจาก API ไม่ได้เป็นเจ้าของที่เก็บข้อมูลสำหรับพารามิเตอร์อีกต่อไป) อาจบันทึกโปรแกรมของฉันเป็น 0 (เนื่องจากการย้ายคอมไพเลอร์ออปติไมซ์ที่ดีที่สุดสามารถทำได้ตอนนี้) และแม้ว่าจะบันทึกงาน การจัดสรรสองสามอย่างที่จะไม่ทำและจะไม่ทำหลังจากเริ่มทำงานหรือในลูปขนาดใหญ่ที่ใดที่หนึ่ง ไม่ใช่สำหรับ API นี้
อย่างไรก็ตามวิธีนี้ดูเหมือนว่าจะทำตามคำแนะนำที่ฉันเห็นที่อื่นเช่นคำตอบนี้ :
นอกจากนี้เนื่องจาก C ++ 17 คุณควรหลีกเลี่ยงการส่ง const std :: string & ตามด้วย std :: string_view:
ฉันพบว่าคำแนะนำที่น่าแปลกใจเนื่องจากดูเหมือนว่าจะสนับสนุนการแทนที่วัตถุที่ค่อนข้างปลอดภัยด้วยการใช้วัตถุที่ปลอดภัยน้อยลง
ดังนั้นเมื่อใดควรใช้ string_view และควรใช้เมื่อใด
<string>
ส่วนหัวและเกิดขึ้นโดยอัตโนมัติ รหัสนั้นเป็นการหลอกลวงและผิด
std::string_view
นวกรรมิกโดยตรงคุณควรจะผ่านสายไปยังวิธีการรับstd::string_view
โดยตรงและมันจะแปลงโดยอัตโนมัติ