首先,樣板。我在類型中工作,而不是常量,因爲使用類型進行元編程要容易得多。
template<class T>struct tag{using type=T;};
template<class Tag>using type_t=typename Tag::type;
template<int I>using int_k=std::integral_constant<int, I>;
template<class...>struct types{using type=types;};
template<template<class...>class Z, class pack>
struct apply;
template<template<class...>class Z, class pack>
using apply_t=type_t<apply<Z,pack>>;
template<template<class...>class Z, class...Ts>
struct apply<Z, types<Ts...>>:tag<Z<Ts...>>{};
現在,一旦我們有中間元素的包裝,我們可以應用它們。
template <std::size_t N, class... Ts>
using get_t = type_t< std::tuple_element< N, std::tuple<Ts...> > >;
從類型列表中獲取第n個類型。
template <class Is, class pack>
struct get_slice;
template <class Is, class pack>
using get_slice_t=type_t<get_slice<Is,pack>>;
template<std::size_t...Is, class...Ts>
struct get_slice<std::index_sequence<Is...>,types<Ts...>>:
types< get_t<Is, Ts...>... >{};
這讓我們拿一包,並從中得到一個切片。
偏移索引列:
template<class Is, std::size_t I>
struct offset;
template<class Is, std::size_t I>
using offset_t=type_t<offset<Is,I>>;
template<std::size_t...Is, size_t I>
struct offset<std::index_sequence<Is...>, I>:
tag<std::index_sequence<(I+Is)...>>
{};
提取中間分子開始在長度LEN的開始:
template<std::size_t start, std::size_t len, class pack>
struct get_mid:
get_slice< offset_t< std::make_index_sequence<len>, start >, pack >
{};
template<std::size_t start, std::size_t len, class pack>
using get_mid_t=type_t<get_mid<start,len,pack>>;
,現在我們可以將元素分成第一,最後和東西在休息一個元組:
template<int p_first, int p_second, int p_third, int...is>
class MyClass {
using pack = types< int_k<p_first>, int_k<p_second>, int_k<p_third>, int_k<is>... >;
OtherClass<p_first> first;
using mid = get_mid_t<1, sizeof...(is)+1, pack >;
template<class...Ts>
using OtherClass_tuple = std::tuple<OtherClass<Ts::value>...>;
apply_t< OtherClass_tuple, mid > middle;
OtherClass<get_t<sizeof...(is)+2, pack>::value> last;
};
因此,您需要根據您獲得的整數參數來確定最後一個值和中間值? –
你對中間值做了什麼? – Barry
您是否正在重塑[元組](http://en.cppreference.com/w/cpp/utility/tuple)? – Drop