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...
}
Wiem, że zamiast tego mogę po prostu użyć listy par lub czegoś podobnego, ale interesuje mnie to, jak to zrobić, zachowując składnię funkcji w celu:
const auto formatted = descf(L"message", "arg1", arg1, "arg2", arg2);
bool
doint
podczas indeksowania, więc zdecydowałem się na rzeczywistąint
zmianę stanu. A przedrostek po kontra++
wymaga dodatkowych cykli myślowych (przynajmniej dla mnie), podczas gdy oddzielny1 -
tak naprawdę nie może być źle odczytany. Krótko mówiąc, starałem się, aby było to jak najbardziej czytelne, ale zależy to oczywiście od osobistego gustu (lub odpowiedniego przewodnika po stylu). max66 skondensował to znacznie więcej.std::array
zamiast rodzimej tablicy wydaje się bezcelową komplikacją.std::array<const char*, 2>
nieskończenie bardziej czytelny niżconst char**
. Ale znowu, to moja najlepsza szansa na czytelność wokół jakiejś dość niejasnej składni, możesz zrobić z tym, co chcesz we własnym kodzie. Wszystko, co mogę zrobić, to podać punkt danych tego, co uważam za czytelne.Jest to łatwe dzięki kilku funkcjom pomocniczym, które są zgodne z następującym wzorcem.
To nie jest wyrażenie krotnie, ale wynik netto jest taki sam.
źródło
Podejrzewam, że możesz spróbować z indeksem i operatorem trójskładnikowym.
Coś w następujący sposób
źródło
std::array
(to w każdym razie klasy lekkiej), ale (tak myślę, że lepiej jest zaakceptowana odpowiedź) jest mniej czytelna.Poniższy kod powinien załatwić sprawę. Pakiet parametrów jest rozwijany na liście inicjalizatora.
źródło
args
aby wszystko można było zamienić nastd::string
s.Z
std::index_sequence
:Próbny
źródło