簡體   English   中英

強制轉換std :: vector的所有成員

[英]Cast all members of an std::vector

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_cast< std::vector<B*>& >(v)

有沒有辦法避免不安全的演員 - std :: move,placement new,是什么?

因為您不知道原始矢量中的A是否可以轉換為B s。 然后你可以使用raw循環並檢查dynamic_cast每個元素是否可以轉換為B ,從而只使用“safe”元素填充向量:

for(auto &&e : v) {
  auto p = dynamic_cast<B*>(e);
  if(p) vv.push_back(p);
}

另外,您也可以使用下面的模板是一種把一系列的任意A s到一系列任意的B S,沒有如果的范圍令人擔憂的A在那兒有A不能被轉化為s B

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;
  }
}

現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM