如何使用模板构建编译时生成的元数据

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'), ...);
}