c++ - 递归、可变参数模板函数
问题描述
我知道我可以使用常规的可变参数函数来做到这一点,但我想用模板来做到这一点。我的 (C++17) 编译器不同意。
#include <cstdint>
unsigned int fct(unsigned int k)
{
return k;
}
template<std::size_t First, std::size_t... Other>
unsigned int fct(unsigned int k)
{
return First * fct<Other...>(k);
}
int main(void)
{
//const auto k = fct<3u, 5u, 7u>(2u);
return 0;
}
上面的代码编译得很好。但是,如果我选择取消注释的声明k
,编译将失败并显示以下报告:
foo.cpp: In function ‘int main()’:
foo.cpp:17:13: warning: unused variable ‘k’ [-Wunused-variable]
const auto k = fct<3u, 5u, 7u>(2u);
^
foo.cpp: In instantiation of ‘unsigned int fct(unsigned int) [with long unsigned int First = 7; long unsigned int ...Other = {}]’:
foo.cpp:11:30: recursively required from ‘unsigned int fct(unsigned int) [with long unsigned int First = 5; long unsigned int ...Other = {7}]’
foo.cpp:11:30: required from ‘unsigned int fct(unsigned int) [with long unsigned int First = 3; long unsigned int ...Other = {5, 7}]’
foo.cpp:17:35: required from here
foo.cpp:11:30: error: no matching function for call to ‘fct<>(unsigned int&)’
return First * fct<Other...>(k);
~~~~~~~~~~~~~^~~
foo.cpp:9:14: note: candidate: template<long unsigned int First, long unsigned int ...Other> unsigned int fct(unsigned int)
unsigned int fct(unsigned int k)
^~~
foo.cpp:9:14: note: template argument deduction/substitution failed:
foo.cpp:11:30: note: couldn't deduce template parameter ‘First’
return First * fct<Other...>(k);
~~~~~~~~~~~~~^~~
我怎样才能使这项工作?我认为创建一个非模板fct()
就可以了。
解决方案
推荐阅读
- mysql - MySQL AUTO_INCREMENT 不起作用:ER_NO_DEFAULT_FOR_FIELD:字段 'id' 没有默认值
- html - 选择框不遵循 css 样式?
- asp.net - 是否可以偏离标准 Acumatica 页面布局选项?
- php - Laravel - 在项目所在的不同目录中配置存储
- shell - 在运行 JAR 的批处理文件中取第 10 个参数
- python - AWS SES 向邮件添加自定义标头
- reactjs - 用函数更新输入状态
- java - MapStruct - 基于 2 个或更多不同源对象的目标字段的自定义映射
- scala - 在Scala中匹配两个数组
- javascript - for循环和嵌套匿名函数执行完成后返回函数