使用boost :: mpl :: bool_而不是const bool的优点

Ste*_*phQ 9 c++ templates metaprogramming

我对使用它的优点感到困惑

bool_<true> 
Run Code Online (Sandbox Code Playgroud)

bool_<false> 
Run Code Online (Sandbox Code Playgroud)

在模板元编程的上下文中简单地使用const bools的类型.

boost :: mpl库显然更喜欢第一种方法,并定义辅助函数,如and_,or_来帮助管理这样的bool_.像if_"取"一个bool_作为第一个(模板)参数的条件元函数,但在幕后"调用"一个if_c元函数,它期望(const)bool作为第一个(模板)参数.

这个决定背后有什么争论?

预先感谢您的帮助!

小智 11

这是一个简短的例子,我不时地使用这些类型.使用const bool这个例子是不可能的:

void do_something(boost::mpl::bool_<true>)
{
   ...
}

void do_something(boost::mpl::bool_<false>)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

根据参数的类型调用这两个函数之一:

template<class T>
void doIt(void)
{
   do_something(boost::mpl::bool_<boost::is_pointer<T>::val>())
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将调用第一个或第二个函数,这取决于类型T是否为指针的事实.这些类型允许您使用函数重载,使用const bool是不可能的.使用const bool,您必须在运行时决定采用哪个分支.如果被调用的函数本身是模板,如果它们被实例化为非预期的类型,则这是特别重要的,例如上面的第一个函数定义可能包含仅编译指针的代码.

  • 这是一个很好的答案,但它比必要的更冗长.您可以编写`do_something(boost :: is_pointer <T>())`,它将以完全相同的方式执行相同的操作. (2认同)

Dav*_*ams 8

这一切都是为了创建足够的一致性,库可以提供有用的功能.MPL协议是:"所有元函数参数(和返回)都是类型." 这允许我们编写可以在元函数上一般操作的模板.例如,此模板接受任何元函数(或在C++ 03中具有最多N个参数的任何元函数):

template <template <class...> class some_metafunction>
struct wrapper;
Run Code Online (Sandbox Code Playgroud)

一旦你允许一些模板参数是非类型的,编写这样的包装器变得不可能.对于我们关心的实际例子,这种一致性允许库分离和评估MPL lambda表达式.如果允许元函数参数是非类型,那么该特征将是不可实现的,因为没有办法写出xxx从其参数ai中解开外部模板所需的所有部分特化xxx<a1,a2,a3,...>.

一个不那么有趣的,如果不是那么有效的部分原因是,许多事情变得不那么冗长,就像我们在MPL中所做的那样.相比:

and_<mf0<x,y>, mf1<z>, mf2<x,z> >::value
Run Code Online (Sandbox Code Playgroud)

VS

mf0<x,y>::value && mf1<z>::value && mf2<x,z>::value
Run Code Online (Sandbox Code Playgroud)