std::apply-ing sscanf в кортеж, кортеж не обновляется полностью
У меня есть структурированная строка данных, и я хочу разобрать ее в кортеж. Для каждого типа входной строки типы и расположение данных могут быть разными, поэтому я хочу использовать шаблоны и форматы scanf, чтобы избежать необходимости управлять всевозможными переменными и повторяющимся кодом.
Приведенный ниже код должен взять кортеж, выделить его элементы в качестве параметров, а затем обновить эти элементы на основе результатов .
#include <tuple>
#include <cstdio>
#include <cassert>
int main()
{
//pure sscanf
const char msg[] = "000000000A200890";
const char fmt[] = "%04X%04X%04X%04X";
uint16_t a, b, c, d;
sscanf(msg, fmt, &a, &b, &c, &d);
assert(a == 0x0000);
assert(b == 0x0000);
assert(c == 0x0A20);
assert(d == 0x0890);
//into a one-tuple seems to work
std::tuple<uint16_t> onetuple;
const char *shortmsg = "10";
const char *shortfmt = "%02X";
std::apply([&shortmsg, &shortfmt](auto &...args) {
sscanf(shortmsg, shortfmt, &args...);
}, onetuple);
assert(std::get<0>(onetuple) == 0x10);
//into a tuple
std::tuple<uint16_t, uint16_t, uint16_t, uint16_t> dest;
std::apply([&msg, &fmt](auto &...args) {
sscanf(msg, fmt, &args...);
}, dest);
assert(std::get<0>(dest) == 0x0000);
assert(std::get<1>(dest) == 0x0000);
assert(std::get<2>(dest) == 0x0A20);
assert(std::get<3>(dest) == 0x0890);
return 0;
}
Этот пример не работает. Первый блок, использующий чистый
Это в С++17, под GCC.