Pass/forward 将选定数量的参数打包到另一个函数
Pass/forward a selected number of parameter pack to another function
从这个 寻找参数包的唯一值的数量开始,让我想到,如果可以 pass/forward 选定数量的可变参数包到另一个函数或者 return 他们,例如,假设我们有一个 struct
需要一个同质包
template<size_t ... Rest>
struct my_struct;
我想要一个函数 foo
接受这个参数包和 return 另一个 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
包装在另一个元函数中。刚刚建立我的 :
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
的元函数 class 版本,以及一个采用元函数 class 和类型列表并将它们组合在一起的元函数。
所以现在只是:
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>
示例。
- 首先,我们将所有这些数字包装成类型以获得
typelist<0i,5i,2i,0i,4i,2i>
(我只是将 i
用作 shorthand 来表示它是 std::integral_constant
) .
- 接下来我们将其包装在
uniq_t
中,生成 typelist<0i,5i,2i,4i>
.
- 接下来,我们将其传递给
apply_typelist
,它给出类型 quote_c<size_t, my_struct>::apply<0i, 5i, 2i, 4i>
- 根据需要,它本身就是
my_struct<0, 5, 2, 4>
的别名。
从这个 struct
需要一个同质包
template<size_t ... Rest>
struct my_struct;
我想要一个函数 foo
接受这个参数包和 return 另一个 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
包装在另一个元函数中。刚刚建立我的
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
的元函数 class 版本,以及一个采用元函数 class 和类型列表并将它们组合在一起的元函数。
所以现在只是:
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>
示例。
- 首先,我们将所有这些数字包装成类型以获得
typelist<0i,5i,2i,0i,4i,2i>
(我只是将i
用作 shorthand 来表示它是std::integral_constant
) . - 接下来我们将其包装在
uniq_t
中,生成typelist<0i,5i,2i,4i>
. - 接下来,我们将其传递给
apply_typelist
,它给出类型quote_c<size_t, my_struct>::apply<0i, 5i, 2i, 4i>
- 根据需要,它本身就是
my_struct<0, 5, 2, 4>
的别名。