算法函数:将其作为模板或采用std::function参数

Algorithm function: Make it a template or take a std::function parameter?

本文关键字:function 参数 std 函数 算法      更新时间:2023-10-16

我有一个名为Graph的C++类,它有一个用于_each_node()的算法方法。我可以把它做成一个模板,像这样:

template <class UnaryFunction>
UnaryFunction Graph::for_each_node (UnaryFunction f)
{
     /* ... */
}

或者让它使用std::函数,比如:

typedef std::function<void (Node&)> ForEachNodeFunc;
ForEachNodeFunc Graph::for_each_node (ForEachNodeFunc f)
{
     /* ... */
}

标准算法,例如std::for_each,使用第一种方法,而一些库,例如gtkmm(GTK+的C++绑定),将函数作为包含函数的对象的函数指针。

每种选择的优点和缺点是什么?我不确定该选哪一个。什么应该影响选择:我的Graph类是否是类模板,或者算法方法预计使用多少不同的函数,或者速度要求?

看看Andy Prowl的这个答案,我认为这也是你问题的部分答案:

一般来说,如果你面临的设计情况给你一个选择,使用模板。。。

https://stackoverflow.com/a/14678298/1758762(std::函数vs模板)