38

私はboost::optional以下のように使用しようとしています。

#include <iostream>
#include <string>

#include <boost/optional.hpp>

struct myClass
{
   int myInt;
   void setInt(int input) { myInt = input; }
   int  getInt(){return myInt; }
};

boost::optional<myClass> func(const std::string &str)
{
   boost::optional<myClass> value;
   if(str.length() > 5)
   {
      // If greater than 5 length string. Set value to 10
      value.get().setInt(10);
   }
   else if (str.length() < 5)
   {
      // Else set it to 0
      value.get().setInt(0);
   }
   else
   {
      // If it is 5 set the value to 5
      value.get().setInt(5);
   }

   return value;
}


int main()
{
   boost::optional<myClass> v1 = func("3124");
   boost::optional<myClass> v2 = func("helloWorld");
   boost::optional<myClass> v3 = func("hello");

   if (v1)
       std::cout << "v1 is valid" << std::endl;
   else
       std::cout << "v1 is not valid" << std::endl;

   if (v2)
       std::cout << "v2 is valid" << std::endl;
   else
      std::cout << "v3 is not valid" << std::endl;

   if (v3)
      std::cout << "v3 is valid" << std::endl;
   else
      std::cout << "v3 is not valid" << std::endl;

  return 0;
 }

次のエラーが表示されます

prog.exe: /usr/local/boost-1.55.0/include/boost/optional/optional.hpp:631: boost::optional::reference_type boost::optional::get() [with T = myClass; boost::optional::reference_type = myClass&]: アサーション `this->is_initialized()' が失敗しました。

おそらく、オプションの変数が正しく初期化されていません。正しい方法でそれを行う方法は?

make_optional編集::いくつかの非常に良い答えが得られました.さらにいくつかの質問があります.1.関数の最後で使用して'func'返すのは良い考えですか? また 2. 私には割り当てるboost::none価値がないことを強調するために割り当てることを考えていましたが、それが理由boost::noneです。しかし、それが有効かどうかわかりませんか?

4

4 に答える 4

1
boost::optional<myClass> func(const std::string &str)
{
    boost::optional<myClass> value; //not init is invalid
    if(str.length() > 5)       // If greater than 5 length string. Set value to 10
        value = 10;
    else if (str.length() < 5) // Else set it to 0
        value = 0;

    return value;
}


v1 is valid
v2 is valid
v3 is not valid

ブーストによると、オプションのデフォルトctorはオプションのobjを無効として作成します

optional<T> def ; //not initalize with a obj T
assert ( !def ) ;
于 2015-12-11T16:25:18.293 に答える