gpt4 book ai didi

c++ - 这个可变参数模板是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:38 25 4
gpt4 key购买 nike

我在看 this SO question我不明白答案是如何运作的。我将在其中一个答案中发布代码拷贝以供引用:

template<int ...> struct seq {};

// How does this line work?
template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {};

template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };

double foo(int x, float y, double z)
{
return x + y + z;
}

template <typename ...Args>
struct save_it_for_later
{
std::tuple<Args...> params;
double (*func)(Args...);

double delayed_dispatch()
{
return callFunc(typename gens<sizeof...(Args)>::type());
}

template<int ...S>
double callFunc(seq<S...>)
{
return func(std::get<S>(params) ...);
}
};

int main(void)
{
std::tuple<int, float, double> t = std::make_tuple(1, 1.2, 5);
save_it_for_later<int,float, double> saved = {t, foo};
cout << saved.delayed_dispatch() << endl;
}

我不明白的部分是:

template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {};

return callFunc(typename gens<sizeof...(Args)>::type()); 的示例中我假设 sizeof..(Args)将是 3 .所以,

template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {};

成为

template<3, {}> struct gens : gens<3-1, 3-1, {}> {};

这是正确的吗?如果是这样,接下来会发生什么?

最佳答案

让我们手动写下递归:

gens<3> : gens<2, 2>
gens<3> : gens<2, 2> : gens<1, 1, 2>
gens<3> : gens<2, 2> : gens<1, 1, 2> : gens<0, 0, 1, 2>

由于 0 的偏特化,递归停止:

struct gens<0, S...>{ typedef seq<S...> type; }; 

// first 0 consumed by the partial specialization
// S = 0,1,2
struct gens<0, 0, 1, 2> {
typedef seq<0, 1, 2> type;
}

关于c++ - 这个可变参数模板是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9731615/

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