算法函数:将其作为模板或采用std::function参数
Algorithm function: Make it a template or take a std::function parameter?
我有一个名为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模板)
相关文章:
- 为什么 std::function 可以作为 std::not2 的参数?
- 传递给std::function template的template参数究竟代表什么
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 可变参数模板参数扩展 类型为 std::function 的类成员
- std::function<void()> 接受参数
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- C++派生类重载函数(带有 std::function 参数)不可见
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 将函数的参数 - 签名从使用 'std::function<T>' 转换为模板参数类型
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 将另一个类的成员函数传递到 std::function 参数中
- 带有 std::function 的 ADL:可以通过 std::function 参数列表中的类型找到采用 std::function 对象的函数吗?
- 自动类型推导并将 lambda 传递给 std::function 参数
- 如何在模拟期望中调用const std::function<>&参数?
- 将不可复制的闭包对象传递给 std::function 参数
- 将 Python 函数作为 Boost.Function 参数发送
- 二进制泛型lambda不匹配ptr-to-function参数
- 算法函数:将其作为模板或采用std::function参数