Boost.Histogram库中的 static_if 用法实例
在 Boost.Histogram 库的内部实现中,有一个实用性很强的语言特性——static_if。它可以让我们在编译时根据某个条件判断选择不同的代码路径执行,非常类似于运行时的条件语句。下面我们将介绍 static_if 的用法,并展示一个测试程序。
static_if 是如何工作的?
在 C++11 中引入了一个特性:SFINAE (Substitution Failure Is Not An Error)。SFINAE 在模板元编程中是非常常用的,它允许我们在编译期间对类型进行判断和选择。Boost.Histogram 就使用了这个特性来实现 static_if。
基于 SFINAE 和 std::enable_if,Boost.Histogram 实现了一个 metafunction:static_if。该函数接受一个 bool 值为条件,以及两个可调用对象 f 和 g。当条件为真时,static_if 会调用 f,否则调用 g。
下面是 static_if 的定义:
template <bool B, class F1, class F2>
decltype(auto) static_if(F1&& f1, F2&& f2) {
return B ? std::forward<F1>(f1)() : std::forward<F2&g