【问题标题】:Runtime type checking运行时类型检查
【发布时间】:2013-11-02 00:09:42
【问题描述】:

我有一个关于运行时检查操作的问题。 如果一个类包含从BPAbstract 派生的对象的vectorBPAbstract 是纯虚拟的),例如:

typedef std::shared_ptr<BPAbstract> Ptr;
std::vector<BPAbstract::Ptr> objects_;

现在假设我想在 vector 中对特定类型的对象进行分组。

template<class T>
void
GetObjectsByType( std::vector<typename T::Ptr> list ) const
{
    for( BPAbstract::Ptr i : objects_ )
    {
        // ???? ....
    }
}

最好的实现是什么?一种解决方案是尝试将i 转换为T 类型,如果结果不为空,那么我可以将其添加到列表list。我很确定有人知道更好的解决方案...

更好地实施该想法的建议也是可以接受的!

【问题讨论】:

标签: c++ c++11 typechecking


【解决方案1】:

你需要dynamic pointer cast 你的问题是already answered

template<class T>
void
GetObjectsByType( std::vector<typename T::Ptr> list ) const
{
    for( BPAbstract::Ptr i : objects_ )
    {
        T::Ptr candidate = std::dynamic_pointer_cast<T>(i);
        if (candidate)
            list.add(candidate);
    }
}

【讨论】:

  • 感谢您的回答。我已经知道这个答案,我忘了写我已经拥有的代码(对不起):'一个解决方案是尝试将 i 转换为类型 T,如果结果不为 null,那么我可以将它添加到列表中'。我想这是唯一的方法......
【解决方案2】:

对 C++0X 语法感到抱歉,但可以选择动态转换:

class Ai
{
public:
  virtual void a() = 0;
};

class Bi : public Ai
{
public:
  virtual void b() = 0;
};

class A : public Ai
{
public:
  virtual void a() override {printf("Aa\n");}
};

class B : public Bi
{
public:
  virtual void a() override {printf("Ba\n");}
  virtual void b() override {printf("Bb\n");}
};


int _tmain(int argc, _TCHAR* argv[])
{
  typedef std::shared_ptr<Ai> Ptr;
  std::vector<Ptr> list;
  list.push_back(Ptr(new A()));
  list.push_back(Ptr(new B()));

  for (auto i = list.begin(); i != list.end(); ++i)
  {
    (*i)->a();
    auto b = std::dynamic_pointer_cast<Bi>(*i);

    if (b)
    {
      b->b();
    }
    //or, equally valid without additional shared_ptr overhead:

    auto bptr = dynamic_cast<Bi*>(i->get());
    if (bptr )
    {
      bptr->b();
    }
  }

}

但是,Dynamic Cast 很慢。你真的想做一个静态演员(通过暴露一个说嘿,我是 Bi 的成员(不推荐,因为它是一个巨大的痛苦但要维护)),或者使用多态性来选择行为(通过使b() Ai 中的一个函数,让它在你希望它什么都不做的类中什么都不做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 2012-10-05
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多