c++ - 如何将 dynamic_cast 与 for_each 一起使用

标签 c++ foreach dynamic-cast

我有以下代码:

vector<C1*>::iterator itr = vec.begin();
for (; itr != vec.end(); ++itr) {
  C2 *c = dynamic_cast<C2*>(*itr);
  c->f();
}

我想知道是否可以使用一行 for_each 来替换它。我尝试了以下方法:

for_each(vec.begin(), vec.end(), bind2nd(mem_fun(&C2::f), dynamic_cast<C2*>));

但是我得到一个编译错误,

expected unqualified-id before 'dynamic_cast'

那正确的应该是什么?

[编辑] 我不能使用 c++11。看来我必须定义一个额外的仿函数,唉。

对于代码本身的一些质疑: C1和C2是2个纯接口(interface); f() 仅可用作 C2 的 API。 vector “vec”具有同时具有 C1 和 C2 接口(interface)的对象列表,但它们作为 C1* 的 vector 传递给这段代码。

最佳答案

在 C++11 下,我不会使用所有这些 bind 东西,而是使用 lambda :

for_each (vec.begin(), vec.end(), [] (C1* c1) 
{
  C2* c2 = dynamic_cast <C2*> (c1);
  if (c2)
  { 
    c2->f();
  }
});

如果使用 C++11 是不可能的,或者如果出于某些其他原因你回避它,那么我会构造一个 functor将其包装在:

struct call_f
:
  public std::unary_function <C1*, void>
{
  void operator () (C1* c1) const
  {
    C2* c2 = dynamic_cast <C2*> (c1);
    if (c2)
    {
      c2->f();
    }
  }
};

// ...

for_each (vec.begin(), vec.end(), call_f());

关于c++ - 如何将 dynamic_cast 与 for_each 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20912286/

相关文章:

c++ - CMake + qtcreator + MinGW + Debug模式 + Windows 7

c++ - 使用 OpenCV 和 OpenGL 读取 MP4

.net - 在 foreach 循环声明中使用 LINQ

c++ - 不能使用 dynamic_cast 从 Base 转换为 Derived

c++ - 来自两个抽象类的多重继承(Qt)

c++ - 添加新项目时,在 wtl 中滚动 clistviewctrl

c++ - 非法使用此类型作为表达式(错误)C++

sql - Powershell SQL Server 插入 - 最佳实践

c# - 退出循环时 foreach 中的集合突变 : is it an acceptable pattern?

c++ - 符合标准的编译器可以拒绝包含来自非多态类型的 dynamic_cast downcast 的代码吗?