相关疑难解决方法(0)

函数作为模板参数传递

我正在寻找涉及将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>();
}
Run Code Online (Sandbox Code Playgroud)

然而,了解这种技术很困难.谷歌搜索"作为模板参数的功能"不会导致太多.令人惊讶的是,经典的C++模板完整指南也没有讨论它(至少不是我的搜索).

我的问题是这是否是有效的C++(或者只是一些广泛支持的扩展).

另外,在这种模板调用过程中,有没有办法允许具有相同签名的仿函数与显式函数互换使用?

以下就不能在上面的程序中工作,至少在视觉C++,因为语法显然是错误的.能够为仿函数切换函数是很好的,反之亦然,类似于如果要定义自定义比较操作,可以将函数指针或函子传递给std :: sort算法.

   struct add3 {
      void operator() (int &v) {v+=3;}
   };
...

    doOperation<add3>();
Run Code Online (Sandbox Code Playgroud)

指向一个或两个Web链接的指针,或C++模板书中的页面将不胜感激!

c++ templates code-generation functor

216
推荐指数
4
解决办法
18万
查看次数

通过值(?)而不是函数指针传递函数?

对不起,如果之前已经询问过,但我找不到它.

因此,我试图教自己关于模板和新的C++ 11功能(主要是lambdas,我一直喜欢的其他语言).

但是在我的测试中,我找到了一些我不知道它有效的东西,我试图理解它是如何工作的,但是无法弄清楚它.

以下代码:

template <class Func>
void Test( Func callback ) {
    callback( 3 );
}

void Callback( int i ) {
    std::cout << i << std::endl;
}

int main( int argc, char** argv ) {
    Test( &Callback ); // this I was expecting to work, compiler will see its a pointer to a function
    Test( Callback ); // this also works, but how?!
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我理解模板是如何工作的,基本上它们是编译器知道要构建什么的方案,所以第一次调用Test( &Callback );我期望工作,因为编译器将看到模板接收函数地址并假设参数应该是指针.

但是第二个电话是什么?假设是什么模板?一个函数的副本(如果它甚至有意义)?

c++ templates function c++11

10
推荐指数
1
解决办法
1774
查看次数

标签 统计

c++ ×2

templates ×2

c++11 ×1

code-generation ×1

function ×1

functor ×1