gpt4 book ai didi

c++ - 将 mpl lambda 表达式作为模板参数传递

转载 作者:行者123 更新时间:2023-11-28 08:14:59 24 4
gpt4 key购买 nike

我正在尝试编写一个类似于 boost::mpl::find_if 的元函数,但不同之处在于它将从末尾开始遍历序列。我收到编译错误,我猜这些错误来自作为元函数参数传递的 mpl::lambda 的计算。对于我做错了什么的任何指示,我将不胜感激。

现在我正在尝试一个懒惰的解决方案(装饰原来的 find_if):

#include <boost/mpl/reverse.hpp>
#include <boost/mpl/find_if.hpp>
#include <boost/mpl/distance.hpp>
#include <boost/mpl/begin_end.hpp>
#include <boost/mpl/advance.hpp>
#include <boost/mpl/next_prior.hpp>
#include <boost/mpl/lambda.hpp>


using boost::mpl::reverse;
using boost::mpl::find_if;
using boost::mpl::distance;
using boost::mpl::end;
using boost::mpl::advance;
using boost::mpl::prior;
using boost::mpl::lambda;

template<typename SEQ, typename pred>
struct rfind_if {
private:
// find the element in the reversed container
typedef typename reverse<SEQ>::type rev_SEQ;
typedef typename lambda<pred>::type expanded_pred;
typedef typename find_if<rev_SEQ, expanded_pred>::type rev_iter;
// compute the distance of the iterator
typedef typename distance<rev_iter, typename end<rev_SEQ>::type >::type dist;
public:
//compute the iterator
typedef typename advance<typename begin<SEQ>::type, typename prior<dist>::type>::type type;
};

问题是当尝试使用这个函数时:

typedef vector_c<int, 1, 2, 3, 6, 5, 4>::type  test_vect;
typedef find<test_vect, int_<6>::type>::type it_cur;
typedef rfind_if<test_vect, lambda<less<deref<it_cur>::type, _1> >::type >::type it_swap;
std::cout << "it_swap=" << deref<it_swap>::type::value << "\n\n";

我收到神秘错误,我猜这些错误来自 lambda 计算:

 /usr/include/boost/mpl/aux_/preprocessed/gcc/less.hpp:60: error: no type named ‘tag’ in ‘struct mpl_::void_’ (some more template noise)
/usr/include/boost/mpl/not.hpp:43: error: ‘value’ is not a member of ‘boost::mpl::aux::nested_type_wknd<boost::mpl::aux::iter_apply1 (some more template noise)
/usr/include/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp:62: error: no type named ‘type’ in ‘struct boost::mpl::apply2<boost::mpl::protect<boost::mpl::aux::iter_fold_if_pred (some more template noise)
...and much more...

我已经测试了 rfind_if 的内部结构(没有将 lambda 作为模板参数传递)并且它有效,命名:

typedef vector_c<int, 1, 2, 3, 6, 5, 4>::type               test_vect;
typedef boost::mpl::reverse<test_vect>::type rev_SEQ;
typedef find_if<rev_SEQ, less<int_<5>, _1> >::type rev_iter;
typedef distance<rev_iter, end<rev_SEQ>::type >::type dist;
typedef advance<begin<test_vect>::type, prior<dist>::type>::type it_begin;

boost::mpl::for_each< rev_SEQ >( value_printer() );

产生了正确的结果

我知道我的功能效率很低,但现在我想了解问题所在。之后我会写一个合适的实现。

最好的问候

最佳答案

据我所知,rfind_if不是错误的原因,而是代码中的这个问题似乎取消了对 end 的引用的 test_vect .

1)vector_c<int> 中元素的类型似乎integral_c<int> , 不是 int_ .所以find<test_vect, int_<6>::type>::typeendtest_vect .因此取消引用 it_curderef<it_cur>::type无效。

2)如果你的意思是 less<int_<6>, _1>通过 less<deref<it_cur>::type, _1> ,自 test_vect没有这样的元素,rfind_if<...>::type是再次 endtest_vect .所以在 deref<it_swap>::type::value 中取消引用它无效。

解决以上问题后,代码可以在 ideone 上编译.

关于c++ - 将 mpl lambda 表达式作为模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7947661/

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