功能模板专业化的别名

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的专业化的“捷径”。上面的代码是伪代码。

And*_*dyG 5

注释中有一些好的方法: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。

演示版