使用嵌套的boost :: binds

时间:2012-08-18 02:06:41

标签: c++ boost-bind

Compiler: g++ 4.4.3
Boost...: 1.49.0
OS......: Ubuntu

注意:自从我认真使用C ++已有15年了,所以我正在重新学习和学习新东西,因为我也尝试学习Boost。

给出以下代码:

1.      class Beta {
2.      public:
3.          std::string name();
4.      }
5.      
6.      class Alpha {
7.      public:
8.          Beta m_beta;
9.      }
10.     
11.     Alpha one;

由于各种原因,我想使用boost:bind来实现 调用“one.m_beta.name()”的结果相同。一世 认为以下会这样做:

12.     boost::function<std::string(Alpha)>
13.         b = boost::bind(
14.             &Beta::name,
15.             boost::bind(&Alpha::m_beta, _1)
16.         );
17.     cout << "NAME = " << b(one) << "\n";

但是当我编译(在Ubuntu上的g ++ 4.4.3)时,我得到以下内容 错误:

错误:从'const Beta *'无效转换为'Beta *'

查看由此产生的实际类型定义 第13-16行,看起来第15行正在成为'const Beta *',但是 绑定它需要'Beta *'。

然而,这可行:

30.     boost::function<std::string(Beta)>
31.         p1 = boost::bind(&Beta::name,_1);
32.     boost::function<Beta(Alpha)>
33.         p2 = boost::bind(&Alpha::m_beta,_1);
34.     std::cout << "NAME = " << p1(p2(one)) << "\n";

但我真的不想携带很多中间变量。 它确实让我觉得必须有一些方法来获得 第一个版本也可以使用。我已经试过了 以下作为第15行的替代品,但他们都给出了 编译时也出现一个或另一个错误。

50. (boost::function<Beta&(Alpha)>)(boost::bind(&Alpha::m_beta,_1))
51. (boost::function<Beta(Alpha)>)(boost::bind(&Alpha::m_beta,_1))
52. (boost::function<Beta*(Alpha)>)(boost::bind(&Alpha::m_beta,_1))
53. boost::protect(boost::bind(&Alpha::m_beta,_1))
54. boost::ref(boost::bind(&Alpha::m_beta,_1))
55. const_cast<Beta*>(boost::bind(&Alpha::m_beta,_1))
56. const_cast<boost::function<Beta(Alpha) > >(boost::bind(&Alpha::m_beta,_1))
57. const_cast<boost::function<Beta*(Alpha) > >(boost::bind(&Alpha::m_beta,_1))

我错过了什么?

1 个答案:

答案 0 :(得分:5)

明确指定嵌套Beta&的<{1}}返回类型:

boost::bind

发生boost::function< std::string( Alpha ) > b = boost::bind( &Beta::name, boost::bind< Beta& >( &Alpha::m_beta, _1 ) ); const Beta*转换错误的原因是boost::bind与[{3}}具有相同行为的结果,其中指出:

  

Beta*还支持指向数据成员的指针,将它们视为不带参数的函数,并返回对该成员的(const)引用。

因此,嵌套绑定返回mem_fn,这是一个无效的实例,用于调用const Beta&上的非const name()成员函数。