jam*_*mes 2 c++ alias templates
int f1(int a, int b) { return a+b; }
int f2(int a, int b) { return a*b; }
template <typename F> void foo(int i, int j)
{
// do some processing before
F(i,j);
// do some processing after
}
Run Code Online (Sandbox Code Playgroud)
我想像这样对foo的专业化做一个别名:
constexpr auto foo1 = &foo<f1>;
constexpr auto foo2 = &foo<f2>;
Run Code Online (Sandbox Code Playgroud)
并这样调用函数:foo1(1,2);foo2(1,2);
用C ++可以做到这一点吗?谢谢!
编辑: foo()不是f1的包装,它是一个调用f1或f2的函数。在通话之前和之后,我需要做一些额外的事情。F是一个函子,我想要foo的专业化的“捷径”。上面的代码是伪代码。
注释中有一些好的方法:std :: bind,使用lambda,将的实例传递F到函数中,因此我将提供一种替代方法。
如果您要传递的函数类型foo始终为int(int, int),则将template参数设为非类型template参数,然后使用以下函数之一实例化它:
int f1(int a, int b) { std::cout<<"f1\n"; return a+b; }
int f2(int a, int b) { std::cout<<"f2\n"; return a*b; }
template <int(*F)(int, int)>
void foo(int i, int j)
{
F(i,j);
}
Run Code Online (Sandbox Code Playgroud)
然后这样称呼它:
int main()
{
constexpr auto foo1 = foo<f1>;
constexpr auto foo2 = foo<f2>;
foo1(1,2);
foo2(1,2);
}
Run Code Online (Sandbox Code Playgroud)
输出:
f1
f2
我们在这里做的技巧是让模板参数成为对函数的引用,虽然该函数很笨拙但合法AFAIK。
| 归档时间: |
|
| 查看次数: |
441 次 |
| 最近记录: |