gpt4 book ai didi

c++ - 终止类模板递归

转载 作者:行者123 更新时间:2023-11-30 05:47:28 24 4
gpt4 key购买 nike

我最初有以下递归可变参数模板代码

#include <functional>
#include <iostream>

// end of recursion
void apply(std::function<void()> f, int)
{
f();
}

// base recursive
template <typename Head, typename ...Tail>
void apply(std::function<void(Head, Tail...)> f, int i)
{
auto g = [=](Tail&& ...args)
{
f(i, std::forward<Tail>(args)...);
};

apply(std::function<void(Tail...)>{g}, ++i);
}

void foo(int a, int b, double c, int d)
{
std::cout << a << b << c << d << std::endl;
}

int main()
{
auto f = std::function<void(int, int, double, int)>(foo);
apply(f, 0);
}

它工作正常,但我必须为 Head=double 添加一个案例,所以我最终使用了部分特化结构

#include <functional>
#include <iostream>

// base recursive case
template <typename Head, typename ...Tail>
struct Apply {
static void apply(std::function<void(Head, Tail...)> f, int i)
{
auto g = [=](Tail&& ...args)
{
f(i, std::forward<Tail>(args)...);
};

Apply<Tail...>::apply(std::function<void(Tail...)>{g}, ++i);
}
};

// specialization case for double
template <typename ...Tail>
struct Apply<double, Tail...> {
static void apply(std::function<void(double, Tail...)> f, int i)
{
auto g = [=](Tail&& ...args)
{
f(777.0, std::forward<Tail>(args)...);
};

Apply<Tail...>::apply(std::function<void(Tail...)>{g}, ++i);
}
};

// end of recursion
template <>
struct Apply {
static void apply(std::function<void()> f, int)
{
f();
}
};

void foo(int a, int b, double c, int d)
{
std::cout << a << b << c << d << std::endl;
}

int main()
{
auto f = std::function<void(int, int, double, int)>(foo);
Apply<int, int, double, int>::apply(f, 0);
}

但是当它被称为 Apply<Tail...>::apply(std::function<void(Tail...)>{g}, ++i); 时,我似乎无法想出结构的正确“递归结束”版本。 , 其中Tail...是空的。

声明结构的方式 -- template <typename Head, typename ...Tail> -- 它至少需要一种类型,所以它不能为空,因此我无法结束递归。但我也不能解除这个要求,因为我需要一种方法来引用所有类型,但第一个类型(即 Tail... )在 apply 中。方法。

最佳答案

提供一个允许空特化的主模板。

template <typename ...Types>
struct Apply;

现在提供两个偏特化:

template <typename ... Tail>
struct Apply<double, Tail...>
{
...
};

template <typename Head, typename ... Tail, typename = std::enable_if_t<!std::is_same<Head, double>::value>>
struct Apply<Head, Tail...>
{
...
};

最后,空特化:

template <>
struct Apply<>
{
...
};

关于c++ - 终止类模板递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28552632/

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