C++ 强制转换std::vector的所有成员 A类{}; B类:公共A{}; std::向量v; //通过库api填充向量 //现在我需要将它转换为std::vector

C++ 强制转换std::vector的所有成员 A类{}; B类:公共A{}; std::向量v; //通过库api填充向量 //现在我需要将它转换为std::vector,c++,c++11,casting,C++,C++11,Casting,投下整个作品: class A {}; class B : public A {}; std::vector<A*> v; // populate the vector via library api // now I need it cast to std::vector<B*> auto vv=reinterpret\u cast(v) 有没有办法避免不安全的cast-std::move、placement new之类的 因为您不知道原始向量中的As是否可以转换为

投下整个作品:

class A {};
class B : public A {};
std::vector<A*> v;
// populate the vector via library api
// now I need it cast to std::vector<B*>
auto vv=reinterpret\u cast(v)

有没有办法避免不安全的cast-std::move、placement new之类的

因为您不知道原始向量中的
A
s是否可以转换为
B
s。然后,您可以使用原始循环并使用
dynamic\u cast
检查每个元素是否可转换为
B
,从而仅使用“安全”元素填充向量:

auto vv = reinterpret_cast< std::vector<B*>& >(v)

首先,你怎么知道每个
A*
都是
B*
?@PiotrSkotnicki,好问题。下面是我在代码库中的注释,解释它。这是一个重构操作<代码>//我不知道为什么我们假设所有的A指针都是B指针,但这就是它以前的实现方式,我一直这样做。向量是如此巨大以至于你不会冒险复制吗?(它只存储指针)我将创建自己的vector_包装类,通过引用获取原始向量,并提供一个类似的API在内部执行转换,而不是潜在的不安全的reinterpret_转换。(假设您实际上不需要向量,但只想使用它的方法。)请注意,如果从
a*
B*
的转换需要调整指针,则无论编译器如何,重新解释转换总是会失败。例如,如果
A
不是
B
的第一个基类,则此操作失败。正常的元素类型转换在这些情况下会起作用。使用
auto p=dynamic_cast<…
@MSalters-Thanxs会更简单,我已经改变了你的建议。
for(auto &&e : v) {
  auto p = dynamic_cast<B*>(e);
  if(p) vv.push_back(p);
}
template<typename C, typename InputIterator, typename OutputIterator>
std::enable_if_t<std::is_base_of<std::remove_pointer_t<typename std::iterator_traits<InputIterator>::value_type>, 
  std::remove_pointer_t<C>>::value> 
cast_range(InputIterator first, InputIterator last, OutputIterator out) {
  while(first != last) {
    auto p = dynamic_cast<std::remove_pointer_t<C>*>(*first);
    if(p) *out = p;
    ++first;
  }
}