本文可简单了……结论先行:尽量别用 Boost 进行函数式编程。
原因
- 它们大部分已经被加入标准库,应该直接使用 STL。
Boost | STL | Header |
---|---|---|
Boost.Function | std::function | <functional> |
Boost.Bind | std::bind | <functional> |
Boost.Ref | std::ref, std::cref | <functional> |
Boost.Lambda | lambda | part of C++11 |
- Boost.Phoenix 是个例外,目前并没有 STL 可以完全替代,但它可读性不好,尽量不要用。
使用时机
有时候用 Boost.Phoenix 省事,因为它就像 lambda 表达式的模板,比如:
1 |
|
本例中采用 Boost.Phoenix 可以自动适配 int 和 long long,而 lambda 表达式是确定的 int 参数,传入 long long 会 warning。
C++14 支持基于类型推断的泛型 lambda 表达式,将上面代码改进一下,说明没必要使用 Boost.Phoenix:
1 |
|
延申讨论
STL 和 Boost 都有的类应该用哪个?
-
如果是标准库原本没有,Boost 先有,然后 Boost 的实现被加入标准库,那么应该使用标准库。
-
如果 Boost 加强了标准库的实现,那么就看标准库能不能满足您的需求,如果不能再采用 Boost 的。
-
因为依赖而必须采用 Boost,那就别费力去改用标准库。比如有些 Boost 库(比如 Boost.Log)使用了 boost::shared_ptr,这时候是不能简单地改用 std::shared_ptr 的。