Bir std::integer_sequence
şablon parametresi olarak bir meta işlevine nasıl (örn. Bir işlev şablonu değil) geçirebilirim? Verilen örnek: örn. Aşağıdaki kullanım durumu (ancak bununla sınırlı değildir):std :: integer_sequence işlevinin bir meta işlevine geçirilmesi
Bir parametre paketinden son N
türlerini kaldırmak için bir tamsayı dizisi kullanmak istiyorum. selector
'u this SO question'dan kullanabileceğimi düşündüm, ancak tamsayı dizisini bu meta işlevine iletemedim.
#include <tuple>
#include <utility>
template <typename T, std::size_t... Is>
struct selector
{
using type = std::tuple<typename std::tuple_element<Is, T>::type...>;
};
template <std::size_t N, typename... Ts>
struct remove_last_n
{
using Indices = std::make_index_sequence<sizeof...(Ts)-N>;
using type = typename selector<std::tuple<Ts...>, Indices>::type; // fails
};
int main()
{
using X = remove_last_n<2, int, char, bool, int>::type;
static_assert(std::is_same<X, std::tuple<int, char>>::value, "types do not match");
}
derleyici hatası
main.cpp:15:55: error: template argument for non-type template parameter must be an expression
using type = typename selector<std::tuple<Ts...>, Indices>::type; // fails
^~~~~~~
main.cpp:5:38: note: template parameter is declared here
template <typename T, std::size_t... Is>
nasıl tamsayı dizisi geçerdi?
İnanılmaz hızlı! –