2

最初に、新しい関数オブジェクト、contains_t の定義が来ます。ヘルパー クラス std::unary_function (正しい typedef の作成を容易にすることを目的とした C++ 標準ライブラリの一部) から継承し、引数と結果の型を自動的に定義することもできますが、明確にするために、必要な typedef は次のとおりです。明示的に提供されます。引数の型が const boost::any& から boost::any に変更され、不正な参照から参照への潜在的な可能性を回避しました。実装は前と同じですが、ここでは関数呼び出し演算子に配置されています。

template <typename T> struct contains_t {
  typedef boost::any argument_type;
  typedef bool result_type;
  bool operator()(boost::any a) const {
    return typeid(T)==a.type();
  }
};

次の実装が参照間を受け取る可能性があるのはなぜですか?

template <typename T> struct contains_t {
  typedef boost::any argument_type;
  typedef bool result_type;
  bool operator()(const boost::any& a) const {
    return typeid(T)==a.type();
  }
};

ありがとうございました

4

1 に答える 1

2

boost :: anyは何でも保存できるため、参照も保存できます。したがって、boost :: anyへの参照がある場合、誤って内部で参照への参照になってしまう可能性があります。

つまり、boost :: anyは任意のタイプTを表すことができます。TをタイプUの参照、つまりT = U&とします。したがって、タイプTの参照を取得すると、タイプUの参照への参照が作成されます。これは、C ++ 03では許可されていません(ただし、C ++ 11では許可されます)。

于 2012-05-31T19:51:47.290 に答える