由于您可以将整数值作为模板参数并对其进行算术运算,那么
boost::mpl::int_<>
和其他整数常量的动机是什么?这个动机在C++11中是否仍然适用?boost::mpl::int_<>
和其他整数常量的动机是什么?这个动机在C++11中是否仍然适用?template<typename R, typename... Args>
std::integral_constant<std::size_t, sizeof...(Args)>
arity(R (*)(Args...))
{ return {}; }
template<typename T>
void frobnicate(T&& t)
{
frob_impl(std::forward<T>(t), std::is_copy_constructible<T>{});
}
这个frob_impl
函数可以根据传入的第二个参数类型 integer_constant<bool, b>
进行重载:
template<typename T>
void frob_impl(T&& t, std::true_type)
{
// do something
}
template<typename T>
void frob_impl(T&& t, std::false_type)
{
// do something else
}
您可以尝试通过将布尔值作为模板参数来实现类似的功能:
frob_impl<std::is_copy_constructible<T>::value>(std::forward<T>(t));
frob_impl<true, T>
和frob_impl<false, T>
执行不同的操作。根据布尔常量的类型进行重载允许您基于“可复制构造”特性的值轻松执行不同的操作,在C++11中仍然非常有用。int
和包含两个int
的结构体)的重载函数,并使用sizeof
测试“值”。在C++11中,函数可以返回true_type
和false_type
,这更具表现力,例如,测试“此类型是否具有名为foo
的成员?”的特性可以使表示正结果的函数返回true_type
,并使表示负结果的函数返回false_type
,这有什么比这更清晰的呢?true_type
和false_type
,因为很多编译时“问题”都有真/假答案,但是当我想要测试可能有超过两个不同结果的东西时,我会使用integral_constant
的其他专门化。