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...
}
Eu sei que posso apenas usar uma lista de pares ou algo parecido, mas estou interessado em como fazer isso, mantendo a sintaxe da função:
const auto formatted = descf(L"message", "arg1", arg1, "arg2", arg2);
bool
para aint
indexação, então fui com um realint
para alternar o estado. E o pré-vs postfix++
leva ciclos mentais extras para verificar (pelo menos para mim), enquanto o separado1 -
não pode realmente ser mal interpretado. Resumindo, tentei manter isso o mais legível possível, mas é claro que isso depende do gosto pessoal (ou do guia de estilo aplicável). O max66 condensou muito mais.std::array
matriz em vez de uma matriz nativa parece uma complicação inútil.std::array<const char*, 2>
infinitamente mais legível do queconst char**
. Mas, novamente, esta é minha melhor chance de legibilidade em torno de uma sintaxe bastante obscura; você pode fazer com ela o que quiser em seu próprio código. Tudo o que posso fazer é fornecer os dados do que considero legível.Isso é fácil com algumas funções auxiliares que seguem o seguinte padrão.
Esta não é uma expressão de dobra, mas o resultado líquido é o mesmo.
fonte
Suponho que você possa tentar com um índice e um operador ternário.
Algo da seguinte forma
fonte
std::array
(que, de qualquer forma, é uma classe leve), mas (então eu acho que é preferível a resposta aceita) seja menos legível.O código a seguir deve fazer o truque. O pacote de parâmetros é expandido em uma lista de inicializadores.
fonte
args
sejam conversíveis emstd::string
s.Com
std::index_sequence
:Demo
fonte