4
コンパイラ:g ++ 4.4.3
ブースト...: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)、次のエラーが発生します。

エラー:「constBeta*」から「Beta*」への無効な変換</blockquote>

13〜16行目からの実際の型定義を見ると、15行目が「constBeta *」になっているように見えますが、バインドの折り返しには「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))

私は何が欠けていますか?

4

1 に答える 1

5

Beta&ネストされたboost::bind:のリターンタイプを明示的に指定します。

boost::function< std::string( Alpha ) > b =
  boost::bind(
    &Beta::name,
    boost::bind< Beta& >( &Alpha::m_beta, _1 ) );

const Beta*およびBeta*変換エラーが発生している理由は、とboost::bind同じ動作をした結果ですboost::mem_fn

mem_fnまた、データメンバーを引数を取らず、メンバーへの(const)参照を返す関数として扱うことにより、データメンバーへのポインターをサポートします。

したがって、nested-bindはを返しますconst Beta&。これは、で非constname()メンバー関数を呼び出すための無効なインスタンスBetaです。

于 2012-08-18T03:19:54.560 に答える