我可以避免所有这些倍数try/catch

Ale*_*xis 0 c++ boost-any c++11

我有一个很多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;
  }
};
Run Code Online (Sandbox Code Playgroud)

所以我做了以下功能(非常丑陋),但谁工作正常

我是 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){}
    }
Run Code Online (Sandbox Code Playgroud)

我试图添加许多" try{}try{}catch{}"但它不起作用

你有什么解决方案比我做的更好

编辑

我尝试过James Kanze,user1131467和Praetorian的解决方案

所以这3个工作正常,但是当我计算执行时间时,user1131467的答案比另一个快一点.我现在必须找到一种解决方案,将每种类型存储在地图中以避免所有这些if/else

我还将看一下boost :: variant

And*_*zos 7

使用指针形式any_cast更清晰,因为它使用指针的可空性:

for (const auto & elem : m)
    if (T1* p = any_cast<T1>(&elem))
    {
         do stuff with *p;
    }
    else if (T2* p = any_cast<T2>(&elem))
    {
         do stuff with *p;
    }
    else if (...)
    {
         ...
    }
Run Code Online (Sandbox Code Playgroud)

这也具有每个案例进行一次演员的优点.


Jam*_*nze 5

您可以创建一个函数:

template <typename T>
bool 
isInstanceOf( boost::any const& object )
{
    return boost::any_cast<T>( &object ) != nullptr;
}
Run Code Online (Sandbox Code Playgroud)

并使用它,如果要检查:

if ( isInstanceOf<std::vector<int>>( elem ) ) {
    display( boost::any_cast<std::vector<int>>( elem ) );
} else if ( isInstanceOf<std::vector<IContainer*>>( elem) ) {
    display( boost::any_cast<std::vector<IContainer*>>( elem) );
} 
//  ...
Run Code Online (Sandbox Code Playgroud)