如何使用模板构建编译时生成的元数据
How to use templates to build compile-time generated metadata
在尝试调用可变参数模板时出现错误。
这个问题现在已经分解成错误,更深层次的目标在 Is it possible to build a const array at compile time using a c++ variadic template?
为了单独测试可变参数模板,我尝试只打印出值。所以我显然以某种方式弄乱了模板:
template<typename T, typename ...Args>
void test(T first, Args... args) {
cout << sizeof(first) << '\n';
test(args...);
}
int main() {
test(123_u32, 1234_u64, 1.23_f32, 1.23456_f64);
}
错误是:
错误:没有匹配函数来调用“test()”
测试(参数...);
我不明白的是,这是从 Eli Bendersky 的博客 post 中截取的,并且有效:
template<typename T, typename... Args>
T adder(T first, Args... args) {
return first + adder(args...);
}
你必须记住,模板就是模板。
template<typename T, typename ...Args>
void test(T first, Args... args) {
cout << sizeof(first) << '\n';
test(args...);
}
int main() {
test(123_u32, 1234_u64, 1.23_f32, 1.23456_f64);
}
这将扩展到
void test(uint32_t first, uint64_t arg1, float32_t arg2, float64_t arg3) {
cout << sizeof(first) << '\n';
test(arg1, arg2, arg3);
}
void test(uint64_t first, float32_t arg1, float64_t arg2) {
cout << sizeof(first) << '\n';
test(arg1, arg2);
}
void test(float32_t first, float64_t arg1) {
cout << sizeof(first) << '\n';
test(arg1);
}
void test(float64_t first) {
cout << sizeof(first) << '\n';
test(); //ERROR
}
int main() {
test(123_u32, 1234_u64, 1.23_f32, 1.23456_f64);
}
为了解决这个问题,您可以创建一个专门的版本,它只接受一个参数,不会在没有参数的情况下调用 test()
。
template<typename T>
void test(T first) {
cout << sizeof(first) << '\n';
}
mentioned blog post,完全一样。
编辑:
正如@Jarod42 在 C++17 及更高版本中所指出的,您不需要编写递归模板,但可以使用 fold expressions:
直接使用参数包
template<typename ...Ts>
void test(Ts... args)
{
((std::cout << sizeof(first) << '\n'), ...);
}
在尝试调用可变参数模板时出现错误。 这个问题现在已经分解成错误,更深层次的目标在 Is it possible to build a const array at compile time using a c++ variadic template?
为了单独测试可变参数模板,我尝试只打印出值。所以我显然以某种方式弄乱了模板:
template<typename T, typename ...Args>
void test(T first, Args... args) {
cout << sizeof(first) << '\n';
test(args...);
}
int main() {
test(123_u32, 1234_u64, 1.23_f32, 1.23456_f64);
}
错误是:
错误:没有匹配函数来调用“test()” 测试(参数...);
我不明白的是,这是从 Eli Bendersky 的博客 post 中截取的,并且有效:
template<typename T, typename... Args>
T adder(T first, Args... args) {
return first + adder(args...);
}
你必须记住,模板就是模板。
template<typename T, typename ...Args>
void test(T first, Args... args) {
cout << sizeof(first) << '\n';
test(args...);
}
int main() {
test(123_u32, 1234_u64, 1.23_f32, 1.23456_f64);
}
这将扩展到
void test(uint32_t first, uint64_t arg1, float32_t arg2, float64_t arg3) {
cout << sizeof(first) << '\n';
test(arg1, arg2, arg3);
}
void test(uint64_t first, float32_t arg1, float64_t arg2) {
cout << sizeof(first) << '\n';
test(arg1, arg2);
}
void test(float32_t first, float64_t arg1) {
cout << sizeof(first) << '\n';
test(arg1);
}
void test(float64_t first) {
cout << sizeof(first) << '\n';
test(); //ERROR
}
int main() {
test(123_u32, 1234_u64, 1.23_f32, 1.23456_f64);
}
为了解决这个问题,您可以创建一个专门的版本,它只接受一个参数,不会在没有参数的情况下调用 test()
。
template<typename T>
void test(T first) {
cout << sizeof(first) << '\n';
}
mentioned blog post,完全一样。
编辑:
正如@Jarod42 在 C++17 及更高版本中所指出的,您不需要编写递归模板,但可以使用 fold expressions:
直接使用参数包template<typename ...Ts>
void test(Ts... args)
{
((std::cout << sizeof(first) << '\n'), ...);
}