2

次のようなパラメーターを保持する汎用構成クラスを作成しようとしています (大幅に簡略化されています)。

class Parameter
{
public:
   Parameter(boost::any value, bool isRequired) 
     : value(value), isRequired(isRequired) {}
   bool isSet;
   bool isRequired;
   boost::any value;
};

class ParameterGroup
{
public:
   map<std::string, Parameter> table;
   // references for chaining
   ParameterGroup& add_parameter_group(const string &token, const bool isRequired);
   ParameterGroup& add_parameter(const string &token, const bool isRequired);

   template<typename T>
   T& get_parameter(const string &token);
};

問題はadd_parameter_group関数にあります:

ParameterGroup& ParameterGroup::add_parameter_group(const string &token, 
                                                    const bool &isRequired)
{
   table[token] = Parameter(ParameterGroup(), isRequired);
   return boost::any_cast<ParameterGroup>(table[token].value);
}

リターンはメッセージでコンパイルに失敗します

error: invalid initialization of non-const reference of type ParameterGroup& from an 
       rvalue of type ParameterGroup

理由がわかりません。ドキュメントによるとboost::any_cast

ポインターが渡された場合、成功した場合は値の内容への同様に修飾されたポインターを返します。それ以外の場合は null が返されます。T が ValueType の場合、保持されている値のコピーを返します。それ以外の場合、T が (おそらく const 修飾された) ValueType への参照である場合、保持されている値への参照を返します。

本来あるべきように参照を返さないのはなぜですか?

4

2 に答える 2

3

Tは参照型ではありませんがValueType、引用したドキュメントによると、値を取得します。

次に、この [一時的な] 値を ref-to-non- にバインドしようとしていますconst

アクティブ化しようとしている条項は次のとおりです。

Tが (おそらく const 修飾された)への参照である場合ValueType、保持されている値への参照を返します。

Tそれでは、以下を参照してみましょうValueType

boost::any_cast<ParameterGroup&>(table[token].value);
//              ^^^^^^^^^^^^^^^
//              |------------||
//                ValueType (ref)
//              |-------------|
//                     T

これで、保持された値への参照が取得され、戻り値の型にうまくバインドされます。

于 2013-12-04T16:11:18.827 に答える
1

boost::any ヘッダーから直接取得

  template<typename T> T any_cast(any &);
  template<typename T> T any_cast(const any &);
  template<typename ValueType> const ValueType * any_cast(const any *);
  template<typename ValueType> ValueType * any_cast(any *);

したがって、値を要求するとboost::any_castがコピーを返すことがわかります。これが、参照を返すことができない理由です。したがって、参照をキャストして any_cast を試してください

于 2013-12-04T16:11:08.573 に答える