删除最后一种模板参数包

Tob*_*ndt 7 c++ templates

我想使用模板参数包的类型作为不同模板的参数,但切断最后一个参数.

例如:

template <class... Ts> struct some_template;

template <class... Ts> struct foo
{
    using bar = some_template<magically_get_all_but_last(Ts)...>;
};

// I might be missing a few "typename"s, but you get the idea.
static_assert(std::is_same<foo<int, bool, std::string>::bar, some_template<int,bool> >::value); 
Run Code Online (Sandbox Code Playgroud)

请注意,这与仅获取最后一个参数相反.

Die*_*ühl 5

这是一个简单的方法,它std::tuple_element<I, Tuple>std::index_sequence<sizeof...(Ts) - 1variadic参数列表中的最后一个类型一起使用.由于需要索引的参数包,所以有一个额外的间接,它被放入一个基础但可以在任何地方.

template <class T, class... Ts> struct foobase;
template <std::size_t... I, class... Ts>
struct foobase<std::index_sequence<I...>, Ts...> {
    using bar = some_template<typename std::tuple_element<I, std::tuple<Ts...>>::type...>;
};

template <class... Ts> struct foo
    : foobase<std::make_index_sequence<sizeof...(Ts) - 1>, Ts...>
{
};
Run Code Online (Sandbox Code Playgroud)

  • `std::index_sequence` 和系列可以使用 C++11 实现。它们只是不属于标准库的一部分。所以我建议创建您自己的版本。[提案 n3658](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3658.html) 指出,例如,[这种方法](http://stackoverflow.html)。 com/a/14059084/1120273)。 (2认同)

Hol*_*Cat 5

这是我使用 C++11 的解决方案:

template <typename ...P>
struct dummy {};

template <template <typename ...> class Obj, typename T, typename ...P>
struct internal;

template <template <typename ...> class Obj, typename ...P1, typename T, typename ...P2>
struct internal<Obj, dummy<P1...>, T, P2...>
{
    using type = typename internal<Obj, dummy<P1..., T>, P2...>::type;
};

template <template <typename ...> class Obj, typename ...P1, typename T, typename L>
struct internal<Obj, dummy<P1...>, T, L>
{
    using type = Obj<P1..., T>;
};

template <template <typename ...> class T, typename ...P>
struct subst_all_but_last
{
    using type = typename internal<T, dummy<>, P...>::type;
};
Run Code Online (Sandbox Code Playgroud)

像这样使用:

using bar = typename subst_all_but_last<some_template, Ts...>::type;
Run Code Online (Sandbox Code Playgroud)

代替

using bar = some_template<magically_get_all_but_last(Ts)...>;
Run Code Online (Sandbox Code Playgroud)