Metode yang disukai untuk pemformatan string di c++? [duplikat]

Ini agak bertele-tele menurut selera saya:

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

Apakah ada cara yang elegan untuk memformat pesan teks menggunakan pernyataan satu baris yang ringkas, mungkin dengan templat atau makro?


person alexm    schedule 11.12.2014    source sumber
comment
seperti printf atau sprintf maksudmu?   -  person RobP    schedule 11.12.2014
comment
Anda dapat memeriksa format boost: boost.org/doc/libs/1_55_0/ lib/format   -  person Adrian Cornish    schedule 11.12.2014
comment
ya, seperti sprintf tetapi aman untuk mengetik.   -  person alexm    schedule 11.12.2014
comment
Lihat juga: stackoverflow.com/questions/2342162/   -  person uncletall    schedule 11.12.2014
comment
@Adrian: terima kasih, itulah yang saya cari   -  person alexm    schedule 11.12.2014
comment
Ya, Boost.Format adalah jawabannya.   -  person Lightness Races in Orbit    schedule 11.12.2014
comment
@πάντα ῥεῖ Ugh, pertanyaan dan jawabannya itu buruk sekali. Saya harap Anda tidak menutup ini; Saya baru saja hendak mengirimkan jawaban yang bagus dengan contoh yang bagus untuk pertanyaan spesifik OP ini. Huh. Baiklah.   -  person Lightness Races in Orbit    schedule 11.12.2014
comment
@LightnessRacesinOrbit Siap melayani Anda, dibuka kembali ;-) ...   -  person πάντα ῥεῖ    schedule 11.12.2014
comment
Setuju, ini bukan duplikat seperti yang ditanyakan - Alex jelas menginginkan sesuatu yang lain meskipun format boost ada dalam pertanyaan di bagian bawah daftar   -  person Adrian Cornish    schedule 11.12.2014
comment
format boost terinspirasi oleh python, saya yakin. meskipun python 3 menghilangkan sintaksnya.   -  person v.oddou    schedule 11.12.2014
comment
Jika Anda benar-benar menginginkan satu kalimat, Anda dapat melakukan ini: string msg = (ostringstream("Selected elements: ") << i << "," << j << ".").str(); Perhatikan penggunaan ostringstream, bukan ostrstream.   -  person Remy Lebeau    schedule 11.12.2014
comment
@Remy Astaga! Saya tidak akan menyebutnya elegan :)   -  person MatiasFG    schedule 11.12.2014
comment
@LightnessRacesinOrbit Saya baru saja akan mengirimkan jawaban yang bagus dengan contoh yang bagus untuk pertanyaan spesifik OP ini. ??   -  person πάντα ῥεῖ    schedule 11.12.2014
comment
@πάνταῥεῖ Saya pergi tidur.   -  person Lightness Races in Orbit    schedule 11.12.2014
comment
Kemungkinan duplikat: stackoverflow.com/q/2342162/560648 (tapi saya masih belum yakin)   -  person Lightness Races in Orbit    schedule 11.12.2014


Jawaban (2)


Ya; Anda mencari Boost.Format:

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

(demo langsung)

person Lightness Races in Orbit    schedule 11.12.2014

Yang paling mungkin Anda cari adalah sprintf yang berfungsi seperti printf, tetapi mengembalikan cstring . Jadi kode Anda akan menjadi
string msg(sprintf( "Selected elements: %d, %d.", i, j ) )

EDIT

Sepertinya saya tidak membaca tautan saya sendiri. Jadi sekali lagi Anda memiliki kode tiga baris. Anda selalu dapat mendefinisikan yang berikut ini

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

Kemudian Anda cukup menggunakan operator + untuk menggabungkan string.

string msg("Selected elements: " + itostr(i) + "," + itostr(j) + ".");
person dconman    schedule 11.12.2014
comment
ini tidak bisa berhasil. sprintf menampilkan hasil dalam argumen pertamanya. di sini argumen pertama Anda adalah format string. yang seharusnya merupakan konstanta. - person v.oddou; 11.12.2014
comment
std::sprintf() adalah rekomendasi terburuk yang dapat saya pikirkan di sini. - person πάντα ῥεῖ; 11.12.2014