如何在boost lambda中使用下标运算符

时间:2014-01-17 11:57:48

标签: c++ boost lambda

我的以下程序给出了大量错误,我试图在noost lambda表达式中使用operator []。请建议在lambda中使用重载运算符的方法

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/algorithm.hpp>
#include <boost/lambda/if.hpp>
#include <boost/lambda/bind.hpp>

#include <boost/assign/std/vector.hpp>

using namespace std ;
using namespace boost ;
using namespace boost::lambda ;

using namespace std ;
using namespace boost::assign ;

int main()
{
    vector<int> nums ;
    nums += 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
    vector<int> flags(11, 0) ;

    cout << "Input Vector : "<<endl ;
    copy(nums.begin(), nums.end(), ostream_iterator<int>(cout, " ")) ;
    cout << endl ;

    for_each(nums.begin(), nums.end(),
             if_then(_1%2 == 0, bind(&vector<int>::operator[], var(flags), _1)=1)) ;
    cout << "Flag Vector : "<<endl ;
    copy(flags.begin(), flags.end(), ostream_iterator<int>(cout, " ")) ;
    cout << endl ;

    return 0 ;
}

1 个答案:

答案 0 :(得分:0)

vector<int>::operator[]已超载。

      reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

除了已知函数类型的有限数量的上下文之外,您不能获取重载函数的地址(成员与否)。

您可以使用显式类型转换来选择正确的函数:

boost::lambda::bind((vector<int>::reference (vector<int>::*)(vector<int>::size_type))(&vector<int>::operator[]), var(flags), _1);

看起来很糟糕?那是因为它是。使用C ++ 11及其内置的lambda并忘记bind就像一场噩梦。