template<class Msg, class... Args>
std::wstring descf(Msg, Args&&... args) {
std::wostringstream woss;
owss << Msg << ". " << ... << " " << args << ": '" << args << "' ";//not legal at all
//or
owss << Msg << ". " << args[0] << ": '" << args[1] << "' " << args[2] << ": '" << args[3] << "' "; //... pseudo code, and so on...
}
Saya tahu saya bisa menggunakan daftar pasangan atau sesuatu seperti itu sebagai gantinya, tetapi saya tertarik pada cara melakukan ini sambil menjaga sintaks fungsi untuk:
const auto formatted = descf(L"message", "arg1", arg1, "arg2", arg2);
bool
keint
ketika mengindeks jadi saya pergi dengan sebenarnyaint
untuk beralih negara. Dan pre-vs postfix++
membutuhkan siklus mental ekstra untuk memverifikasi (setidaknya untuk saya), sedangkan yang terpisah1 -
tidak dapat benar-benar salah dibaca. Singkatnya, saya mencoba untuk menjaga ini agar dapat dibaca, tetapi ini tentu saja sesuai dengan selera pribadi (atau panduan gaya yang berlaku). max66 lebih kental.std::array
bukan array asli tampaknya komplikasi yang tidak ada gunanya.std::array<const char*, 2>
jauh lebih mudah dibaca daripadaconst char**
. Tetapi sekali lagi, ini adalah kesempatan terbaik saya untuk membaca di sekitar beberapa sintaks yang cukup jelas, Anda dapat melakukannya dengan apa yang Anda suka dalam kode Anda sendiri. Yang bisa saya lakukan adalah memberi Anda titik data dari apa yang saya anggap dapat dibaca.Ini mudah dengan beberapa fungsi pembantu yang mengikuti pola berikut.
Ini bukan ekspresi lipat tetapi hasil bersihnya sama.
sumber
Saya kira Anda dapat mencoba dengan indeks dan operator ternary.
Sesuatu sebagai berikut
sumber
std::array
(yang, bagaimanapun, adalah kelas ringan) tetapi (jadi saya pikir lebih disukai jawaban yang diterima) kurang dapat dibaca.Kode berikut harus melakukan trik. Paket parameter diperluas dalam daftar penginisialisasi.
sumber
args
dapat dikonversi kestd::string
s.Dengan
std::index_sequence
:Demo
sumber