my_*_*ion 7 c++ foreach dynamic-cast
我有以下代码:
vector<C1*>::iterator itr = vec.begin();
for (; itr != vec.end(); ++itr) {
C2 *c = dynamic_cast<C2*>(*itr);
c->f();
}
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可以使用one-line for_each来替换它.我尝试了以下方法:
for_each(vec.begin(), vec.end(), bind2nd(mem_fun(&C2::f), dynamic_cast<C2*>));
Run Code Online (Sandbox Code Playgroud)
但是我收到编译错误,
expected unqualified-id before 'dynamic_cast'
Run Code Online (Sandbox Code Playgroud)
什么应该是正确的呢?
[编辑]我不能使用c ++ 11.看起来我必须定义一个额外的仿函数,叹息.
关于代码本身的一些问题:C1和C2是2个纯接口; f()仅作为C2的API提供.向量"vec"有一个具有C1和C2接口的对象列表,但它们作为C1*的向量传递给这段代码.
在C++ 11下bind,我不会做所有这些事情,而是使用lambda:
for_each (vec.begin(), vec.end(), [] (C1* c1)
{
C2* c2 = dynamic_cast <C2*> (c1);
if (c2)
{
c2->f();
}
});
Run Code Online (Sandbox Code Playgroud)
如果使用C++ 11是不可能的,或者由于某些其他原因你回避这个,那么我将构造一个函子来包装它:
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());
Run Code Online (Sandbox Code Playgroud)
dynamic_cast<...>()可能看起来像一个函数,但它不是一个。你可以使用这样的东西:
template <typename T>
struct dynamic_cast_fun {
template <typename F>
T* operator()(F* from) const {
return dynamic_cast<T*>(F* from);
}
};
Run Code Online (Sandbox Code Playgroud)
(可能有一些额外的重载来处理参数的常量性)。
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |