为了账号安全,请及时绑定邮箱和手机立即绑定

函数作为模板参数传递

函数作为模板参数传递

C++
HUH函数 2019-07-25 16:00:46
函数作为模板参数传递我正在寻找涉及将C ++模板函数作为参数传递的规则。这得到了C ++的支持,如下例所示:#include <iostream>void add1(int &v){   v+=1;}void add2(int &v){   v+=2;}template <void (*T)(int &)>void doOperation(){   int temp=0;   T(temp);   std::cout << "Result is " << temp << std::endl;}int main(){   doOperation<add1>();   doOperation<add2>();}然而,了解这种技术很困难。谷歌搜索“作为模板参数的功能”不会导致太多。令人惊讶的是,经典的C ++模板完整指南也没有讨论它(至少不是我的搜索)。我的问题是这是否是有效的C ++(或者只是一些广泛支持的扩展)。另外,在这种模板调用过程中,有没有办法允许具有相同签名的仿函数与显式函数互换使用?以下就不能在上面的程序中工作,至少在视觉C ++,因为语法显然是错误的。能够为仿函数切换函数是很好的,反之亦然,类似于如果要定义自定义比较操作,可以将函数指针或函子传递给std :: sort算法。   struct add3 {       void operator() (int &v) {v+=3;}    };...     doOperation<add3>();指向一个或两个Web链接的指针,或C ++模板书中的页面将不胜感激!
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

是的,它是有效的。

至于使它与仿函数一起使用,通常的解决方案是这样的:

template <typename F>void doOperation(F f){
  int temp=0;
  f(temp);
  std::cout << "Result is " << temp << std::endl;}

现在可以称为:

doOperation(add2);doOperation(add3());

这样做的问题是,如果它使编译器内联调用变得棘手add2,因为所有编译器都知道void (*)(int &)正在传递函数指针类型doOperation。(但是add3,作为一个仿函数,可以很容易地内联。在这里,编译器知道类型的对象add3被传递给函数,这意味着要调用的函数是add3::operator(),而不仅仅是一些未知的函数指针。)


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 1817 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信