5

オブジェクトへの参照をオブジェクトに格納したいboost::any。boost::any オブジェクトを初期化するにはどうすればよいですか? を試しstd::ref()ましたboost::anyが、 で初期化されstd::reference_wrapper<>ます。たとえば、次の

#include <boost/any.hpp>
#include <cxxabi.h>
#include <iostream>

int main(void)
{
  int s;
  int i = 0;
  boost::any x(std::ref(i));
  std::cout << abi::__cxa_demangle(x.type().name(), 0, 0, &s) << "\n";
  return 0;
}

版画

std::reference_wrapper<int>

代わりboost::anyに含むようにしたい。int&

4

2 に答える 2

5

このboost::anyクラスには、次のようなインターフェースがありません。コンストラクターで参照のタイプを指定する必要があります。テンプレート化されたコンストラクターのタイプを明示的に指定できるとは思いません。それを貼り付けることができる場所が見当たらないからです。テンプレートパラメータを明示的に指定できたとしても、C ++ 2003では機能しません。これは、参照の折りたたみが利用できず、パラメータが次のように宣言されているためT const&ですT& const&。私はあなたの最善の選択肢は、std::reference_wrapper<T>あなたがリモートで参照しているように見えるものを主張する場合に使用するか、または単に使用することだと思いますT*

boost::anyとは言うものの、テンプレート引数を明示的に指定するために使用されるのと同様のタイプのテンプレート化された静的因子メソッドを持つことは一般的に可能です。ただし、値型boost::anyを処理するように意図的に設計されているため、これは実行されません。私はそれが同様に行われるべきかどうか少し疑わしいです:ポインタを使用することは完全に良い代替手段です。本当に参照型が必要な場合は、おそらく自分で実装する必要があります。

于 2012-01-14T21:24:13.967 に答える
3

動作は正しく、期待され、適切です。std::refは type のオブジェクトを作成するヘルパー関数でstd::reference_wrapper<T>あり、参照ラッパーは参照を保持する値セマンティクスを持つクラスです。これは、コンテナに外部参照を追跡させたい場合に、コンテナに入れたいものとまったく同じものです。

だから、あなたが持っている解決策を使ってください。

必要に応じて、参照の配列を持つことができないのと同じように、直接のネイキッド参照のコンテナーを持つことはできません。ラッパーは、そのようなニーズに正確に対応するように設計されています。

于 2012-01-14T23:49:46.227 に答える