通配符函数指针非类型模板参数

wildcard function pointer non-type template parameter

本文关键字:参数 类型 函数 指针 通配符      更新时间:2023-10-16

模板可以采用非类型函数指针参数,但如果接受所有可能的函数指针参数,则会出现问题,例如:

void dummy()
{
}
template <typename FT, FT* fp>
void proxy()
{
  fp();
}
int main()
{
  proxy<decltype(dummy), &dummy>();
  return 0;
}

如您所见,这非常麻烦。是否有更方便的方法将"通配符"函数指针作为非类型模板参数提供?

针对特定问题的更好解决方案是仅将函数类型作为模板参数,将项作为普通函数参数。还可以使用类型推断,而不是显式指定使用哪些参数类型:

void dummy()
{
}
template <typename FT>
void proxy(FT fp)
{
  fp();
}
int main()
{
  proxy(fp);
  return 0;
}

如果你知道你想调用的函数的签名(当然你知道),你不能这样做吗

template<void F()>
void proxy()
{
    F();
}
void dummy() {}
int main()
{
    proxy<dummy>();
}

从 c++17 开始,我们现在有了这个:

void dummy() { }
template <auto fp>
void proxy()
{
  fp();
}
int main()
{
  proxy<dummy>();
  return 0;
}

您可能还想查看 require 关键字。