将选定数量的参数包传递/转发到另一个函数

时间:2016-05-12 13:20:51

标签: c++ c++11 template-meta-programming

来自此earlier question的查找参数包的唯一值的数量,让我想一想,是否可以将选定数量的可变参数包传递/转发到另一个函数或返回它们例如,假设我们有struct采用同类包

template<size_t ... Rest>
struct my_struct;

我希望有一个函数foo,它接受​​这个参数包并返回另一个struct,其中包含传递给它的参数包的唯一值,类似于

template<size_t N, size_t ... Rest>
my_struct<uniques<N,Rest...>> foo(const my_struct<N,Rest...> &a) {
// do stuff
}

举个例子:

my_struct<0,5,2,0,4,2> a;
my_struct<0,5,2,4> b = foo(a);

对值进行排序,这里没有任何兴趣。仅使用标准库是否可以实现此功能?

1 个答案:

答案 0 :(得分:3)

uniques包裹在另一个元函数中。只是建立我的last answer

template <class T, template <T...> class Z>
struct quote_c {
    template <class... Ts>
    using apply = Z<Ts::value...>;
};

template <class MFC, class TL>
struct apply_typelist;

template <class MFC, class TL>
using apply_typelist_t = typename apply_typelist<MFC, TL>::type;


template <class MFC, class... Ts>
struct apply_typelist<MFC, typelist<Ts...>> {
    using type = typename MFC::template apply<Ts...>;
};

现在我们有一个元函数类版本my_struct,以及一个元函数,它接受一个元函数类和一个类型列表并将它们组合在一起。

所以现在它只是:

template <class T, T... Vals>
using typelist_c = typelist<std::integral_constant<T, Vals>...>;

template <size_t N,
          size_t ... Rest,
          class R = apply_typelist_t<quote_c<size_t, my_struct>,
                        uniq_t<typelist_c<size_t, N, Rest...>>>
          >
R foo(const my_struct<N,Rest...> &a) {
    // ...
}

完成<0,5,2,0,4,2>的示例。

  1. 首先,我们将所有这些数字换成类型以获得typelist<0i,5i,2i,0i,4i,2i>(我只是使用i作为速记来表示它是std::integral_constant)。
  2. 接下来,我们将其包含在uniq_t中,生成typelist<0i,5i,2i,4i>
  3. 接下来,我们将其传递给apply_typelist,它为我们提供了类型quote_c<size_t, my_struct>::apply<0i, 5i, 2i, 4i>
  4. 根据需要,它本身是my_struct<0, 5, 2, 4>的别名。