Нетипичный параметр шаблона для полиморфной лямбды?

Можно ли написать что-то подобное?

[](std::index_sequence<std::size_t ...I> s) {

};

Или это?

[]<std::size_t ...I>(std::index_sequence<I...> s) {

}

Как синтаксис для этого в C ++ 14 или C ++ 17? Или это вообще невозможно? По сути, я просто хочу иметь I как пакет параметров шаблона, и лямбда просто служит способом сделать это. Альтернативно, есть ли синтаксис для достижения следующего?

std::index_sequence<std::size_t ...I> x = std::make_index_sequence<10>{};

// I now is a local template parameter pack

4

Решение

GCC обеспечивает последний синтаксис как продолжение, но это не стандартно

template <typename... Ts>
void foo(const std::tuple<Ts...>& t) {
auto l = [&t]<std::size_t ...I>(std::index_sequence<I...> s) {
std::initializer_list<int>{ (std::cout << std::get<I>(t), 0)... };
};

l(std::index_sequence_for<Ts...>{});
}

Live Demo

2

Другие решения

Не совсем то же самое, но, возможно, вы можете передать последовательность с помощью вспомогательной функции следующим образом:

#include <functional>
#include <cstddef>
#include <iostream>

auto lambda = [](auto... I){
int arr[] = { (std::cout << I << std::endl, 0)... };
(void)arr;
};

template<std::size_t... I>
constexpr auto f(std::index_sequence<I...>) {
return lambda(I...);
}

int main() {
f(std::make_index_sequence<3>());
}
0

По вопросам рекламы [email protected]