作为传统函数指针的替代,C++11引入了
模板别名,与
可变参数模板结合使用可以简化函数指针语法。以下是创建“模板”函数指针的示例:
template <typename R, typename ...ARGS> using function = R(*)(ARGS...)
它可以这样使用:
void foo() { ... }
int bar(int) { ... }
double baz(double, float) { ... }
int main()
{
function<void> f1 = foo;
function<int, int> f2 = bar;
function<double, double, float> f3 = baz;
f1(); f2({}); f3({}, {});
return 0;
}
此外,它可以很好地处理函数重载:
void overloaded(int) { std::cout << "int version\n"; }
void overloaded(double) { std::cout << "double version\n"; }
int main()
{
function<void, int> f4 = overloaded;
function<void, double> f5 = overloaded;
f4({});
f5({});
return 0;
}
它可以作为声明函数指针参数的一种非常棒的方式:
void callCallback(function<int, int> callback, int value)
{
std::cout << "Calling\n";
std::cout << "v: " << callback(value) << '\n';
std::cout << "Called\n";
}
int main()
{
function<int, int> f2 = bar;
callCallback(f2, {});
return 0;
}
这个模板别名可以作为std::function
的替代,它既没有缺点也没有优点(这里有一个很好的解释)。
演示实例
简而言之,我认为结合可变参数模板的模板别名是C++中一个不错、漂亮、整洁和现代的选择,可以替代"裸"函数指针 (毕竟,这个别名本质上仍然是函数指针)。但是,std::function
同样是一个好、漂亮、整洁和现代的C++组件,具有优秀的特性值得考虑。选择使用函数指针(或别名)还是选择std::function
取决于您的实现需求。