2016-07-28 11 views
4

このような書き込みが可能ですか?多型ラムダの非型テンプレートパラメータ?

[](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 
+0

あなたが望むものではありません:https://stackoverflow.com/documentation/c%2b%2b/572/lambdas/14626/using-lambdas-for-inline-parameter-pack-unpacking#t=201607280832233700555あなたが直面している問題のサブセット。一般的に、答えはノーですが、特定の問題を提供できる場合は、時には滑らかな解決策があります。 – Yakk

答えて

2

GCCは、後者の構文as an extensionを提供していますが、それは標準ではありません。

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

ない正確に同じですが、多分あなたのようにヘルパー関数で列をプッシュすることができますそれは次のとおりです:

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