Отображение пакета параметров в пакет параметров - PullRequest
0 голосов
/ 20 октября 2019

Я хочу переназначить пакет параметров в пакет параметров другого типа. Точнее, у меня есть функция:

template<typename ...type_pack, typename Function = void(type_pack&&...)>
        constexpr decltype(auto) zip(Function&& op, type_pack&&... pack)
        {
            static_for<0, N_lhs>([&](auto i)
                {
                    op(pack[i]...);
                });
            return;
        }

По сути, я хочу создать пакет параметров с применением [] к элементам пакета. Обратите внимание, что i здесь является интегральной константой, а static_for это время компиляции, вы можете предположить, что [] равно constexpr. У меня нет большого контроля над op, поэтому он ожидает пакет параметров, а не кортеж.

Редактировать:

Похоже, я был под недопониманием того, что op(pack[i]...) вызывалпроблема, когда на самом деле это легальная конструкция C ++ (я думал, что это незаконно). Похоже, что-то не так с моим циклом static_for. Мой вопрос изначально касался op(pack[i]...), поэтому я оставлю его как есть.

Я подготовил более общий пример, не использующий [], но другую произвольную функцию только для проверки работоспособности: https://godbolt.org/z/h8Hbbt

Есть ли в стандарте место, где упоминается это поведение расширения пакета, а именно тот факт, что функции могут применяться поверх?

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

По сути, я хочу создать пакет параметров с применением [] к элементам пакета.

Вы имеете в виду что-то следующее?

template <typename ... type_pack,
          typename Function = void(decltype(std::declval<type_pack>()[0])...)>
constexpr decltype(auto) zip(Function&& op, type_pack&&... pack)
 {
   /* ... */
 }

Пожалуйста, подготовьте минимальный, но полный пример (в основном static_for), если вы хотите получить более проверенный ответ.

1 голос
/ 20 октября 2019

Пакет параметров может быть расширен в виде шаблона.

template <typename... T>
void test(T... t) {
    (std::cout << ... << static_cast<int>(t));
}

Здесь он расширяется как складываемое выражение, но он работает аналогично обычному расширению пакета. Шаблон здесь static_cast<int>(t), и он расширится до

std::cout << static_cast<int>(t1) << static_cast<int>(t2) << ... << static_cast<int>(tN);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...