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.

0 ответов

Другие вопросы по тегам