วิธีที่ต้องการสำหรับการจัดรูปแบบสตริงใน c ++? [ทำซ้ำ]

นี่เป็นรายละเอียดเล็กน้อยสำหรับรสนิยมของฉัน:

ostrstream ss;
ss << "Selected elements: " << i << "," << j << ".";
string msg(ss.str(), (size_t)ss.pcount());

มีวิธีที่สง่างามในการจัดรูปแบบข้อความโดยใช้คำสั่งบรรทัดเดียวที่กระชับโดยใช้เทมเพลตหรือมาโครหรือไม่?


person alexm    schedule 11.12.2014    source แหล่งที่มา
comment
เช่น printf หรือ sprintf คุณหมายถึงอะไร?   -  person RobP    schedule 11.12.2014
comment
คุณสามารถตรวจสอบรูปแบบบูสต์: boost.org/doc/libs/1_55_0/ libs/รูปแบบ   -  person Adrian Cornish    schedule 11.12.2014
comment
ใช่เหมือน sprintf แต่ปลอดภัยต่อประเภท   -  person alexm    schedule 11.12.2014
comment
ดูเพิ่มเติม: stackoverflow.com/questions/2342162/   -  person uncletall    schedule 11.12.2014
comment
@Adrian: ขอบคุณ นั่นคือสิ่งที่ฉันกำลังมองหา   -  person alexm    schedule 11.12.2014
comment
ใช่แล้ว Boost.Format คือคำตอบ   -  person Lightness Races in Orbit    schedule 11.12.2014
comment
@ πάντα ῥεῖ ฮึคำถามนั้นและคำตอบนั้นแย่มาก ฉันหวังว่าคุณจะไม่ปิดสิ่งนี้ ฉันเพิ่งกำลังจะส่งคำตอบที่ดีพร้อมตัวอย่างที่ดีสำหรับคำถามเฉพาะของนี้ OP ถอนหายใจ โอ้ดี.   -  person Lightness Races in Orbit    schedule 11.12.2014
comment
@LightnessRacesinOrbit ที่บริการของคุณ เปิดใหม่แล้ว ;-) ...   -  person πάντα ῥεῖ    schedule 11.12.2014
comment
ยอมรับว่ามันไม่ซ้ำกับวิธีการถาม - เห็นได้ชัดว่าอเล็กซ์ต้องการอย่างอื่นแม้ว่ารูปแบบการบูสต์จะอยู่ในคำถามนั้นในรายการ   -  person Adrian Cornish    schedule 11.12.2014
comment
ฉันเชื่อว่ารูปแบบบูสต์ได้รับแรงบันดาลใจจาก python แม้ว่า python 3 จะทิ้งไวยากรณ์ก็ตาม   -  person v.oddou    schedule 11.12.2014
comment
หากคุณต้องการซับในเดียวจริงๆ คุณสามารถทำได้: string msg = (ostringstream("Selected elements: ") << i << "," << j << ".").str(); สังเกตการใช้ ostringstream แทน ostrstream   -  person Remy Lebeau    schedule 11.12.2014
comment
@เรมี่ แหวะ! ฉันจะไม่เรียกสิ่งนั้นว่าสง่างาม :)   -  person MatiasFG    schedule 11.12.2014
comment
@LightnessRacesinOrbit ฉันกำลังจะส่งคำตอบที่ดีพร้อมตัวอย่างที่ดีสำหรับคำถามเฉพาะของ OP นี้ ??   -  person πάντα ῥεῖ    schedule 11.12.2014
comment
@ πάνταῥεῖ ฉันไปนอนแล้ว   -  person Lightness Races in Orbit    schedule 11.12.2014
comment
อาจซ้ำกัน: stackoverflow.com/q/2342162/560648 (แต่ฉันยังไม่มั่นใจ)   -  person Lightness Races in Orbit    schedule 11.12.2014


คำตอบ (2)


ใช่; คุณกำลังมองหา Boost.Format:

const int i = 3, j = 4;
const std::string msg = (boost::format("Selected elements: %d %d") % i % j).str();

(การสาธิตสด)

person Lightness Races in Orbit    schedule 11.12.2014

สิ่งที่คุณกำลังมองหามากที่สุดคือ sprintf ซึ่งทำงานเหมือน printf แต่ส่งคืน cstring . ดังนั้นโค้ดของคุณจะเป็น
string msg(sprintf( "Selected elements: %d, %d.", i, j ) )

แก้ไข

เหมือนไม่ได้อ่านลิงค์ของตัวเองเลย คุณมีรหัสสามบรรทัดอีกครั้ง คุณสามารถกำหนดสิ่งต่อไปนี้ได้ตลอดเวลา

std::string itostr( int i )
{
    char temp[20];
    std::sprintf( temp, "%d" i);
    std::string out(temp);
    return out;
}

จากนั้นคุณสามารถใช้ตัวดำเนินการ + เพื่อต่อสตริงได้

string msg("Selected elements: " + itostr(i) + "," + itostr(j) + ".");
person dconman    schedule 11.12.2014
comment
สิ่งนี้ไม่สามารถทำงานได้ sprintf ส่งออกผลลัพธ์ในอาร์กิวเมนต์แรก อาร์กิวเมนต์แรกของคุณคือสตริงรูปแบบ ซึ่งควรจะเป็นค่าคงที่ - person v.oddou; 11.12.2014
comment
std::sprintf() เป็นคำแนะนำที่แย่ที่สุดที่ฉันนึกถึงได้ที่นี่ - person πάντα ῥεῖ; 11.12.2014