【发布时间】:2018-08-19 16:31:11
【问题描述】:
我愿意做这么简单的事情:
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...);
}
那么,鉴于此函数签名不使用任何 BRACED-INIT-LIST 技术,实现递归的最简单方法是什么:
template <typename I, typename... In>
void bar();
【问题讨论】:
-
你需要在某个时候结束递归,对吧?这就是为什么你必须声明空参数列表的原因。
-
第一个不起作用,因为它最终会尝试调用
bar<>();。 -
“braced-init-list 技术”是什么意思?我在您的问题中没有看到带括号的初始化列表。
-
@HolyBlackCat 感谢您的回复。可以使用一个支撑初始化列表来解决我的问题,这对我来说不是一个解决方案。
-
现在我很好奇。你能展示这样的解决方案吗?
标签: c++ c++11 templates recursion variadic-templates