cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить runtime функцию для доступа к элементу std::tuple по индексу #555

Open ExpertSDR3 opened 1 year ago

ExpertSDR3 commented 1 year ago

При написании библиотек периодически сталкиваюсь с задачей обращения к экземпляру типа внутри std::tuple по индексу в runtime. Готового решения нет, есть std::apply, который передаёт сразу все экземпляры в функтор в виде аргументов, но мне нужен только один.

Предположим, есть бинарный протокол управления устройством, имеется набор команд, каждая команда это класс, реализуется некоторый шаблонный класс протокола, которому шаблонными параметрами передаются все команды и они хранятся в std::tuple.

template <class Cmds...>
struct protocol_t {

    void process(std::size_t index, std::span<std::byte> bytes) {
        std::apply_one([&](auto &&cmd){ 
            cmd.process(bytes);
        }, index, m_commands);
    }

private:
    std::tuple<Cmds...> m_commands;
};

Пример реализации:

kelbon commented 1 year ago

Это делается наоборот через превращение индекса в constexpr индекс и потом обращение по нему

visit([&]<size_t I>{
    std::get<I>(tpl);
  },
  index);