gpt4 book ai didi

c++ - 在 C++11 中使用模板参数的递归可变参数 void 函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:48 24 4
gpt4 key购买 nike

我愿意做这么简单的事情:

template <typename I, typename... In>
void bar() {
// Use I here
bar<In...>(); // Enable recursion
}

然而,这会导致“对重载函数的模糊调用”。让我好奇的是波纹管代码有效:

template <typename T = void>
void foo() { }

template <int T, int... Tn>
void foo() {
foo<Tn...>();
}

这是为什么呢?以下内容也有效:

void foobar() {}

template <typename I, typename... In>
void foobar(I i, In... in) {
foobar(in...);
}

那么,什么是实现递归的最简单方法,给定此函数签名WITHOUT USING ANY BRACED-INIT-LIST TECHNIQUES:

template <typename I, typename... In>
void bar();

最佳答案

可以用同样的方法解决foo()解决:当Tn...列表为空,foo<>()被调用,所以 foo()调用具有 type 模板参数(但具有默认值)的版本(编译器将 foo<>()foo<void>() 匹配)。

对于 bar()您可以切换整数和类型。

您可以添加接收具有默认值的非类型模板参数的终端版本

template <int = 0>
void bar()
{ }

所以当你调用bar()空的 In...类型列表,编译器匹配调用 bar<>()bar<0>() .

--- 编辑 ---

OP 询问

If foo<>() matches with foo<void>(), why doesnt bar<>() match with bar<void>() (template <typename Dummy = void> instead of template <int = 0>)? In other words, why does it have to be a template <int = 0> (of int type)?

首先,为什么foo()有用吗?

因为有一个foo()接收一个或多个整数和一个 foo() 的可变参数模板函数接收单一类型的模板(默认)。

因此,当您调用 foo<> ,它不匹配整数可变版本(因为至少需要一个整数)并且匹配类型版本(激活 void 默认类型)。

第二:为什么bar()添加接收单一(默认)类型的版本不起作用?

因为您有一个接收一种或多种类型的可变参数模板函数

template <typename I, typename... In>
void bar ()
{ bar<In...>(); }

所以如果你添加一个接收一种类型的版本(默认)

template <typename = void>
void bar ()
{ }

编译器遇到麻烦:调用 bar() 时选择哪个版本与最后一种类型?

我的意思是:你调用bar<int, long>()并且只有可变版本匹配。

但是可变版本调用bar<long>() .

现在的问题是 bar() 的两个版本(可变参数和单一类型)匹配。

所以编译器给你一个错误。

诀窍是创建一个 bar()具有单个默认模板参数的版本可以匹配空列表调用 ( foo<>() ) 但不与类型可变版本冲突。

一个可能的解决方案是 int一个,但您可以选择其他类型( charlongunsigned long long 等),甚至可以选择基于模板模板默认参数的版本。

我的意思是...而不是

template <int = 0>
void bar ()
{ }

你可以使用

template <template <typename...> class = std::vector>
void bar()
{ }

这不是建议:我认为 int = 0更容易编写和理解。只是为了展示另一种可能的方式。

重点是添加一个模板,该模板接收单个默认值但不接收类型名。

关于c++ - 在 C++11 中使用模板参数的递归可变参数 void 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49221934/

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