【问题标题】:wildcard function pointer non-type template parameter通配符函数指针非类型模板参数
【发布时间】:2013-11-08 11:01:13
【问题描述】:

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

void dummy()
{
}

template <typename FT, FT* fp>
void proxy()
{
  fp();
}

int main()
{
  proxy<decltype(dummy), &dummy>();

  return 0;
}

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

【问题讨论】:

  • @Chowlett 不,不一样。您引用的问题缩小了可以提供的函数指针的种类。
  • @KerrekSB Watson 先生,我不能使用函数来执行此操作,因为函数参数不能用于实例化更多模板。
  • @user1095108:啊,我的一个基本疏忽。
  • 也许宏是这个用例的明智解决方案。

标签: c++ c++11


【解决方案1】:

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

void dummy()
{
}

template <typename FT>
void proxy(FT fp)
{
  fp();
}

int main()
{
  proxy(fp);

  return 0;
}

【讨论】:

  • 我需要保留函数指针作为模板参数来实例化其他模板。
  • @user1095108 那么是从proxy()内部调用其他模板方法,还是实例化模板类?如果是第一个,这些调用是否也可以使用类型推导?如果第二个 - 嗯....
  • @user1158692 一个模板函数被实例化,并且,除了FTfp,它还知道返回类型和参数的类型(因为这些是推导出来的)。知道这一切后,它可以提供正确类型的参数并从 fp 返回正确的值。
【解决方案2】:

如果你知道你想调用的函数的签名(你肯定知道),难道你不知道

template<void F()>
void proxy()
{
    F();
}

void dummy() {}

int main()
{
    proxy<dummy>();
}

【讨论】:

  • 我不知道签名。可以取任意函数指针,没有限制。
  • @user1095108 等等,你必须知道函数签名才能从proxy(或其他任何地方)调用函数,因为proxy(或其他任何地方)必须提供任何参数和正确的类型!?永远不会调用该函数的任何一个-在这种情况下,请不要打扰它! ;-)
  • @user1158692 我可以用FTfp 实例化一个模板,然后然后它可以推断出参数和返回类型是什么类型并将它们提供给@ 987654326@ 以某种方式调用时。它可以从任何它想要的地方获取参数,网络,数据库......
【解决方案3】:

从 c++17 开始,我们现在有了this

void dummy() { }

template <auto fp>
void proxy()
{
  fp();
}

int main()
{
  proxy<dummy>();

  return 0;
}

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

【讨论】:

  • template &lt;auto fp&gt; 中模板非类型参数的占位符类型是 C++17 功能。
  • 我会编辑答案,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
相关资源
最近更新 更多