Можно ли использовать один кортеж для индексации другого? - PullRequest
0 голосов
/ 09 мая 2020

У меня есть два кортежа: один с данными, которые я хочу, а другой со списком индексов для первого кортежа. Я хочу использовать второй кортеж для доступа к элементам из первого кортежа, используя std::get, но, похоже, это не работает:

    const auto tup     = std::make_tuple(4, 5, 6);
    const auto indeces = std::make_tuple(0, 1, 2);

    const int index = std::get<0>(indeces);
    const int value = std::get<index>(tup); // won't compile
    // value should equal 4

Конечно, очевидно, почему это не удается, если учесть, что std::get не вернет constexpr:

constexpr int index = std::get<0>(indeces); // won't compile

Тем не менее, вся необходимая информация предоставляется во время компиляции, поэтому я чувствую, что способ должен быть. Есть?


Примечание. Мой кортеж indeces начинает свою жизнь как пакет параметров целых чисел. Я сделал его кортежем, потому что надеялся, что с ним будет легче работать, но это может быть не так. Если кто-нибудь может увидеть способ обойти кортеж indeces и использовать целые числа пакета параметров напрямую для индексации первого кортежа, это тоже будет долгожданным ответом.

1 Ответ

1 голос
/ 09 мая 2020

Вы должны сделать их все constexpr

auto test()
{
    constexpr auto tup     = std::make_tuple(4, 5, 6);
    constexpr auto indeces = std::make_tuple(0, 1, 2);

    constexpr int index = std::get<0>(indeces);
    constexpr int value = std::get<index>(tup);
}

При этом константные интегралы в C ++ имеют особую обработку, и если они инициализируются константой времени компиляции, их можно использовать в контексте времени компиляции. Так что ваш код тоже работает.

...