2016-07-28 17 views
4

Ist es möglich, so etwas zu schreiben?Nicht-Typ-Template-Parameter für polymorphes Lambda?

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

}; 

Oder das?

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

} 

Wie ist die Syntax dafür in C++ 14 oder C++ 17? Oder ist das überhaupt nicht möglich? Im Grunde möchte ich nur die I als Vorlage Parameterpaket haben, und das Lambda dient nur als eine Möglichkeit, das zu tun. Gibt es alternativ eine Syntax, um Folgendes zu erreichen?

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

// I now is a local template parameter pack 
+0

Nicht ganz was du willst: https://stackoverflow.com/documentation/c%2b%2b/572/lambdas/14626/using-lambdas-for-inline-parameter-pack-unpacking#t=201607280832233700555 kann aber ein lösen Teilmenge von Problemen, denen Sie gegenüberstehen. Im Allgemeinen ist die Antwort nein, aber wenn Sie ein spezifisches Problem stellen können, gibt es manchmal glatte Lösungen. – Yakk

Antwort

2

GCC bietet die letztere Syntax as an extension, aber es ist nicht Standard:

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

0

nicht genau das gleiche, aber vielleicht können Sie die Reihenfolge mit einer Hilfsfunktion drücken, wie es folgt:

#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>()); 
}