代码之家  ›  专栏  ›  技术社区  ›  psaghelyi

boost lambda::绑定返回类型选择

  •  1
  • psaghelyi  · 技术社区  · 15 年前

    我想通过lambda::bind调用成员。不幸的是,我有两个同名但返回类型不同的成员。 有没有办法帮助lambda::bind推断成员函数调用的正确返回类型?(bind在显式的返回类型演绎中工作良好)

    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <boost/bind.hpp>
    #include <boost/lambda/lambda.hpp>
    #include <boost/lambda/bind.hpp>
    
    using namespace std;
    using namespace boost;
    
    struct A
    {
      A (const string & name) : m_name(name) {}
    
      string &        name ()         { return m_name; }
      const string &  name () const   { return m_name; }
    
      string m_name;
    };
    
    vector<A> av;
    
    int main () 
    {
      av.push_back (A ("some name"));
    
      // compiles fine
      find_if(av.begin(), av.end(), bind<const string &>(&A::name, _1) == "some name");
    
      // error: call of overloaded 'bind(<unresolved overloaded function type>, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >&)' is ambiguous
      find_if(av.begin(), av.end(), lambda::bind(&A::name, lambda::_1) == "some name");
    
      return 0;
    }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   academicRobot    15 年前

    不同的回报类型是一个红鲱鱼。问题在于方法的const重载(即,无论相对返回类型是什么,您都会遇到相同的问题)。这个问题已经记录下来了 here here ,并使用指定的返回类型 not the recommended solution (除了某些版本的msvc之外,大部分时间都可以工作)。

    问题是获取重载成员函数(const重载或参数重载)的地址是不明确的,因此需要一些额外的信息。

    解决方案是转换函数指针,这样编译器就可以准确地知道您需要哪个重载函数,我找到的最简单的方法是typedef函数指针类型,否则这些行会变得有点讨厌。下面是一个代码示例(编译干净的gcc 4.3.4):

    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <boost/bind.hpp>
    #include <boost/lambda/lambda.hpp>
    #include <boost/lambda/bind.hpp>
    
    using namespace std;
    using namespace boost;
    
    struct A
    {
      A (const string & name) : m_name(name) {}
    
      string &        name ()         { return m_name; }
      const string &  name () const   { return m_name; }
    
      string m_name;
    };
    
    vector<A> av;
    
    //function pointer for non-const version
    typedef string& (A::*NameFuncType)(void);
    
    //function pointer for const version
    typedef const string& (A::*NameConstFuncType)(void) const;
    
    int main () 
    {
      av.push_back (A ("some name"));
    
      //'correct' way to call const version w/ boost::bind
      find_if(av.begin(), av.end(), 
        bind(static_cast<NameConstFuncType>(&A::name), _1) == "some name"
      );
    
      //call for non-const version w/ boost::lambda::bind
      find_if(av.begin(), av.end(), 
         lambda::bind(static_cast<NameFuncType>(&A::name), lambda::_1) == "some name"
      );
    
      return 0;
    }
    
        2
  •  1
  •   Vicente Botet Escriba    15 年前

    对于文档

    “绑定表达式创建的lambda函子的返回类型可以作为显式指定的模板参数给定,如下例所示:

    绑定(目标函数,绑定参数列表)

    所以就跟boost做的一样:绑定。

      find_if(av.begin(), av.end(), lambda::bind<const string &>(&A::name, lambda::_1) == "some name");
    

    P.S.未测试

    推荐文章