c++ - 作为第一个参数的可变参数模板

标签 c++ templates metaprogramming variadic-templates

我想编写一个通用模板函数,它接受和调用许多不同的函数并执行额外的设置和拆卸操作。函数签名在第一个参数上有所不同,例如:

void foo(int i, void* self, (*callback)(void*, int i));
void bar(bool s, bool r, void* self, (*callback)(void*, int i));

我还想挑出 self 参数和 callback,但让它们前面的参数不同。我知道由于解包的工作方式,可变模板很难做到这一点;有什么解决办法吗?

最佳答案

如果我正确理解您的问题,您的问题是按任何顺序使用可变参数模板作为参数,第一个除外。好吧,谢天谢地,所有这些都是有效的:

template<class T, class ...Args> void call1(int y, T first, Args ... args, int x);
template<class T, class ...Args> void call2(int y, int x, T first, Args ... args);
template<class T, class ...Args> void call3(Args ... args, T first, int y, int x);
Edit:
Automatic template deduction will only work for call2
Thanks to @Human-Compiler

当然,可变参数模板是使用递归处理的,因此,为了正确处理它们,如果没有提供 first 参数,您还需要一个函数来调用:

void call1(int y, int x);

一个例子,它只会盲目地调用前 x 个函数:

void print()
{
  std::cout << "print";
}
void call(int x)
{
  return;
}
template<class T, class ...Args> void call(int x, T f, Args ... args)
{
  if(x <= 0) return;
  f();
  call(--x, args...);
}

int main()
{
  call(3, print, print, print);
}

关于c++ - 作为第一个参数的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62268109/

相关文章:

c++ - C++ 中的模板和标准算法

c++ - 为什么这个嵌套的 lambda 不被认为是 constexpr?

python - 装修契约(Contract)

c++ - 在新代码中,为什么要使用 `int` 而不是 `int_fast16_t` 或 `int_fast32_t` 作为计数变量?

c++ - std::vector 的不完整类型

c++ - DirectX/C++ 3D 引擎编程 : Learn now, 还是等待 DirectX 12?

c++ - 在 C++ 中正确模板化字符串比较器

c++ - C++中解决对象间的依赖关系

php 代码应该将我的数据库中的内容打印到模板中

python - 将方法动态绑定(bind)到python中的类实例