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
}
我想为 foo 的专门化创建一个别名,如下所示:
constexpr auto foo1 = &foo<f1>;
constexpr auto foo2 = &foo<f2>;
并像这样调用该函数:foo1(1,2);foo2(1,2);
有什么方法可以在 C++ 中实现这一点吗?谢谢!
Edit:foo() 不是 f1 的包装,它是调用 f1 或 f2 的函数。我需要在通话之前和之后做一些额外的事情。 F 是一个函子,我想要一条通往 foo 专业化的“捷径”。上面的代码是一种伪代码。
评论中有一些很好的方法:std::bind、使用 lambda、传递实例F
到函数中,所以我将提供一个替代方案。
如果您要传递的函数类型foo
一直会int(int, int)
,然后将模板参数设置为非类型模板参数,然后使用您的函数之一实例化它:
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);
}
然后这样称呼它:
int main()
{
constexpr auto foo1 = foo<f1>;
constexpr auto foo2 = foo<f2>;
foo1(1,2);
foo2(1,2);
}
Output:
f1
f2
我们在这里做的技巧是让模板参数成为对函数的引用,这是很hacky但合法的AFAIK。
Demo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)