为什么递归可变参数模板无法按预期工作
Why does recursive variadic templates not work as expected?
#include <type_traits>
template<typename T>
T f(T&& a, T&& b)
{
return a + b;
}
template<typename T, typename... Args>
T f(T&& a, T&& b, Args&&... args)
{
return f(a, f(b, std::forward<Args>(args)...));
}
int main()
{
f(1, 2, 3);
}
VS 2015 输出:错误 C2672:"f":未找到匹配的重载函数
为什么它没有按预期工作?
问题是您在递归调用f
时没有转发a
或b
,这会导致尝试使用 a : int
和 b : int&
调用二进制重载。这是第一步:
template<typename T>
T f(T&& a, T&& b) {
return a + b;
}
template<typename T, typename... Args>
T f(T&& a, T&& b, Args&&... args) {
return f(std::forward<T>(a), f(std::forward<T>(b), std::forward<Args>(args)...));
}
现在的问题是传入的所有参数必须具有相同的值类别,并且任何左值参数都会导致错误,例如 int i = 2; f(1, i, 3);
将失败。要解决此问题..:
template<typename T, typename U>
typename std::decay<T>::type
f(T&& a, U&& b) {
return a + b;
}
template<typename T, typename U, typename... Args>
typename std::decay<T>::type
f(T&& a, U&& b, Args&&... args) {
return f(std::forward<T>(a), f(std::forward<U>(b), std::forward<Args>(args)...));
}
然后可以简化为:
template<typename T, typename U>
typename std::decay<T>::type
f(T&& a, U&& b) {
return a + b;
}
template<typename T, typename... Args>
typename std::decay<T>::type
f(T&& a, Args&&... args) {
return f(std::forward<T>(a), f(std::forward<Args>(args)...));
}
相关文章:
- 即使没有调用这个递归函数,它是如何工作的?
- 递归函数调用在后台工作
- 这个递归函数是如何工作的?
- 使用 std::map 的递归堆栈分配如何工作?
- 为什么递归向后工作?
- 使用递归的函数未按预期工作
- 在 C++ 中使用递归填充 D2 数组,有时工作正常,其他时会引发异常
- 以下递归程序的最后一行是如何工作的
- 我对变量在递归函数中如何工作的理解是否正确?
- 不明白为什么这个简单的递归开始工作然后崩溃
- Word.exe 已停止使用递归工作
- 递归在此代码中的工作原理
- nqueens问题的C 递归解决方案无法正常工作
- C++中的递归选择不能完全正常工作
- 为什么后缀失败并且前缀在传递迭代器作为参数并在尾部位置递归时工作正常
- 无限递归模板实例化使用clang时GCC工作正常
- 我似乎无法让我的最大长度递归函数工作
- 简单的C++递归无法正常工作 - 我只是不明白为什么
- 在指数平方中递归的工作
- g++空函数删除是否递归工作