我正在寻找涉及将 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>();
}
但是,学习这种技术很困难。 Googling for "function as a template argument"不会导致太多。还有经典C++ Templates The Complete Guide令人惊讶的是也没有讨论它(至少不是从我的搜索中)。
我的问题是这是否是有效的 C++(或只是一些广泛支持的扩展)。
另外,在这种模板调用期间,有没有办法允许具有相同签名的仿函数与显式函数互换使用?
以下内容在上述程序中不起作用,至少在 Visual C++ 中是这样。 ,因为语法显然是错误的。能够为仿函数切换函数会很好,反之亦然,类似于如果您想定义自定义比较操作,您可以将函数指针或仿函数传递给 std::sort 算法。
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
如果指向一个或两个 Web 链接,或者 C++ 模板书中的一个页面,我们将不胜感激!
最佳答案
是的,它是有效的。
至于让它与仿函数一起使用,通常的解决方案是这样的:
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
类型的对象被传递给函数,这意味着函数call 是 add3::operator()
,而不仅仅是一些未知的函数指针。)
关于c++ - 作为模板参数传递的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1174169/