作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用一个类型创建一个模板,并传递一个函数,该函数的模板参数包含该类型。
这是我目前拥有的:
#include <iostream>
void fooRef(int& ref) { std::cout << "In ref" << std::endl; }
void fooPtr(int* ptr) { std::cout << "In ptr" << std::endl; }
template<typename T, typename F>
void Print(T arg, F func) {
//DoABunchOfStuff();
func(arg);
//DoSomeMoreStuff();
}
int main() {
int x = 5;
int& ref = x;
Print<int*, void(*)(int*)>(&x, &fooPtr);
Print<int&, void(*)(int&)>(ref, &fooRef);
}
这行得通,但我觉得函数的调用者可能会有些冗长。理想情况下,我希望通话看起来像这样:
Print<int*, fooPtr>(ptr);
Print<int&, fooRef>(ref);
有没有办法简化对 Print 函数的调用?
最佳答案
Is there a way to simplify the calls to the Print function?
是的。您所做的根本不是指定模板类型。函数模板经过一个过程调用 template argument deduction .在此过程中,传递给函数的参数会推导出它们的类型,编译器会尝试将其与模板参数相匹配。如果有效,则该函数将被清除,编译器将继续。所以对于你的代码,如果我们使用
int main() {
int x = 5;
int& ref = x;
Print(&x, &fooPtr);
Print(std::ref(ref), &fooRef);
}
然后我们得到
In ptr
In ref
在第二次调用中,我使用了 std::ref
所以它实际上会通过引用传递 ref
。否则它会复制 ref
所指的内容。
关于c++ - 如何将函数传递给模板函数 A,该函数可能具有基于 A 的另一个参数的不同签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39708538/
我是一名优秀的程序员,十分优秀!