c++ - 将选定数量的参数包传递/转发给另一个函数

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

来自这个earlier question在找到参数包的唯一值的数量时,让我想到,如果将选定数量的可变参数包传递/转发到另一个函数或返回它们是可行的,例如,假设我们有一个 采用同质包的结构

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);

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

最佳答案

只需包装 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> 的别名, 如预期的。

关于c++ - 将选定数量的参数包传递/转发给另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37188197/

相关文章:

c++ - CppUTest 中 extern 关键字的替代品是什么?

c++ - 文本文件 C++ 编辑第一行

c++ - 为什么 std::result_of<int(int)>::type 无效?

c++ - boost::hana::map 作为数据成员

c++ - 如何知道传递给函数的参数是 C++ 中的类、 union 还是枚举?

c++ - 计算存储在数组中的元素

javascript - 用于 Node js 的 c++ v8 异步模块,与结构中的类型相关的错误

c++ - 在返回值上调用 std::move - 签名应该是什么

c++ - 如何在 ubuntu 12.10 中隐藏 g++ c++11 编译警告

c++ - 类型别名允许分配任意指针,尽管 int* 是预期的