gpt4 book ai didi

c++ - 递归构造 unsigned int 的可变参数模板

转载 作者:太空狗 更新时间:2023-10-29 21:04:03 24 4
gpt4 key购买 nike

我在 C++ 2011 代码中需要一个棘手的事情。目前,我有一个这样的元函数:

template<unsigned int N, unsigned int M> 
static constexpr unsigned int myFunction()

这个函数可以根据NM生成数。

我想编写一个带有输入 NM 的元函数,它将通过递减 M 递归构造一个可变参数模板。例如,通过使用 M = 3 调用此函数,它将构造一个名为 List 的可变参数模板,等于:

List... = myFunction<N, 3>, myFunction<N, 2>, myFunction<N, 1>, myFunction<N, 0>

如何做到这一点(当然如果可能的话)?

最佳答案

使用现有的元组包生成器可能是最简单的:

// Idiomatic tuple pack generator using successor method
template<int... I> struct tuple_pack {
using succ = tuple_pack<I..., sizeof...(I)>;
};
template<int N> struct make_tuple_pack {
using type = typename make_tuple_pack<N - 1>::type::succ;
};
template<> struct make_tuple_pack<0> {
using type = tuple_pack<>;
};

现在我们可以应用元组包生成器,委托(delegate)给一个实现函数:

template<int N, int M, typename T> struct foo_impl {};
template<int N, int M, int... I> struct foo_impl<N, M, tuple_pack<I...>> {
static void foo() {
int arr[M] = { myFunction<N, M - I>()... };
}
};
template<int N, int M> void foo() {
foo_impl<N, M, typename make_tuple_pack<M>::type>::foo();
}

如果你更喜欢函数参数推断而不是类模板特化,这也可以写成:

template<int N, int M, int... I> void foo_impl(tuple_pack<I...>) {
int arr[M] = { myFunction<N, M - I>()... };
}
template<int N, int M> void foo() {
foo_impl<N, M>(typename make_tuple_pack<M>::type{});
}

我必须将数组大小指定为 int arr[M];不确定包扩展初始化程序的标准是否要求这样做,或者它是否是 gcc 中的错误;无论哪种方式,都不是什么大麻烦。

关于c++ - 递归构造 unsigned int 的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12284005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com