[英]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.