gpt4 book ai didi

c++ - 如何在 Boost.MPL 中使用嵌套元函数?

转载 作者:行者123 更新时间:2023-11-30 03:41:05 24 4
gpt4 key购买 nike

我有一个简单的元函数:

template <typename T>
using is_const_lvalue_reference = mpl::and_<
std::is_lvalue_reference<T>,
std::is_const<typename std::remove_reference<T>::type>
>;

显然,如果 T 是 MPL 占位符,它就不起作用,因为 remove_reference 是针对占位符类而不是替代类型计算的。如何正确执行此操作才能在 MPL 算法中使用此元函数?

更新:建议的解决方案是用结构替换别名,这将延迟 std::remove_reference 中的模板实例化。问题是,如何在不使用任何辅助结构的情况下延迟内联实例化?

template <typename Sequence>
using are_const_lvalue_references = mpl::fold<
Sequence,
mpl::true_,
mpl::and_<
mpl::_1,
mpl::and_<
std::is_lvalue_reference<mpl::_2>,
std::is_const<typename std::remove_reference<mpl::_2>::type>
>
>
>;

这个例子显然会因为同样的原因而失败。我应该更改什么以使其正确?

最佳答案

以这种方式将类型特征写成别名是行不通的,因为它们会立即被实例化。 is_const_lvalue_reference<_1>正是mpl::and_<std::is_lvalue_reference<_1>, std::is_const<_1>> (因为 _1 不是引用类型)——它总是 false因为左值引用不是 const .相当棘手的写法false_虽然!

相反,您必须延迟实例化。只需让您的类型特征继承自 mpl::and_而不是给它取别名:

template <class T>
struct is_const_lvalue_reference
: mpl::and_<
std::is_lvalue_reference<T>,
std::is_const<std::remove_reference_t<T>>
>
{ };

这边,std::remove_reference_t<T>除非我们实际尝试访问 is_const_lvalue_reference<T>::type,否则不会被实例化- 直到 _1 才会发生在 apply 中被替换为真实类型.


或者,自 apply<>将调用 ::type在它找到占位符的地方,您可以删除显式调用 ::type你自己。所以这有效:

BOOST_MPL_ASSERT(( mpl::apply<
std::is_const<std::remove_reference<_1>>,
int const&
> ));

或者用原来的表达方式:

BOOST_MPL_ASSERT(( mpl::apply<
mpl::and_<
std::is_lvalue_reference<_1>,
std::is_const<std::remove_reference<_1>>
>,
int const&
> ));

请注意,尽管这种结构不能用作类型特征。

关于c++ - 如何在 Boost.MPL 中使用嵌套元函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37550802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com