【发布时间】:2010-11-13 12:51:10
【问题描述】:
我正在寻找涉及将 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++ 模板书中的一页,我们将不胜感激!
【问题讨论】:
-
函数作为模板参数有什么好处?返回类型不会被用作模板类型吗?
-
相关:没有捕获的 lambda 可以衰减为函数指针,您可以将其作为 C++17 中的模板参数传递。 Clang 可以编译它,但是当前的 gcc (8.2) 有一个错误,并且即使使用
-std=gnu++17也错误地将其拒绝为“没有链接”。 Can I use the result of a C++17 captureless lambda constexpr conversion operator as a function pointer template non-type argument?.
标签: c++ templates code-generation functor