我有一个名为 Graph 的 C++ 类,它有一个算法方法 for_each_node()。我可以将其设为模板,如下所示:
template <class UnaryFunction>
UnaryFunction Graph::for_each_node (UnaryFunction f)
{
/* ... */
}
或者让它使用 std::function,像这样:
typedef std::function<void (Node&)> ForEachNodeFunc;
ForEachNodeFunc Graph::for_each_node (ForEachNodeFunc f)
{
/* ... */
}
标准算法,例如 std::for_each,使用第一种方法,而一些库,例如 gtkmm(它是 GTK+ 的 C++ 绑定),将函数作为包含它们的对象的函数指针。
每个选项的优点和缺点是什么?我不确定该选择哪个。什么会影响选择:我的 Graph 类是否是类模板,或者算法方法需要使用多少不同的函数,或者速度要求?