0

私は多くのboost::anyのベクトルを持っていますこのベクトルでは、std::vectorとタイプIContainerの要素に対していくつかの操作を実行する必要があります

class   IContainer
{
public:
  virtual ~IContainer(){}
  virtual const boost::any operator[](std::string) const = 0;
};

class   AContainer : public IContainer
{
  std::vector<int>      vect_;
  std::string name_;
public:
  AContainer() : vect_({0, 1, 2, 3, 4, 5}), name_("AContainer") {}
  virtual const boost::any operator[](std::string key) const
  {
    if (key == "str")
      return (name_);
    if (key == "vect")
      return (vect_);
    return nullptr;
  }
};

だから私は次の機能を実行しました(imoはかなり醜いです)が、誰が正しく動作しますか

メートルはconst std::vector<boost::any>&

for (const auto & elem : m)
    {
      try
        {
          std::vector<int> v = boost::any_cast<std::vector<int>>(elem);
          display(v);
        }
      catch(boost::bad_any_cast){}
      try
        {
          std::vector<IContainer*> v = boost::any_cast<std::vector<IContainer*>>(elem);
          display(v);
        }
      catch(boost::bad_any_cast){}
      try
        {
          AContainer v(boost::any_cast<AContainer>(elem));
          try
            {
              display(boost::any_cast<const std::vector<int>>(v["vect"]));
            }
          catch (boost::bad_any_cast){}
          try
            {
              std::cout << boost::any_cast<const std::string>(v["str"]) << std::endl;
            }
          catch (boost::bad_any_cast){}
          try
            {
              display(boost::any_cast<std::vector<int> >(v));
            }
          catch (boost::bad_any_cast) {}
        }
      catch(boost::bad_any_cast){}
    }

多くの " try{}try{}catch{}" を追加しようとしましたが、うまくいきません

私がやったことよりも良い解決策はありますか

編集

James Kanze、user1131467、および Praetorian のソリューションを試しました

したがって、3つはうまく機能していますが、実行時間を計算すると、user1131467の答えは他の答えよりも少し高速です。このすべての if/else を回避するために、各タイプをマップに格納するソリューションを見つける必要があります

また、boost::variant も見ていきます。

4

7 に答える 7

0

すべてのステートメントを 1 つの try ブロックに入れることができます。

try {
    // do all your stuff
}
catch (boost::bad_any_cast) {}
于 2013-07-12T14:38:24.820 に答える