簡體   English   中英

使用* void作為static_cast的緩沖區

[英]using *void as a buffer for static_cast

所以我去這個:

class A;

class B : public A;

class C : public B;

vector<A*> *vecA;

vector<C*> *vecC;

我想將vectC轉換為vecA。

vector<A*> *_newA = static_cast< vector<A*>* >(vecC); //gives an error

因此,我將void指針用作緩沖區和演員表:

void *buffer = vecC;

vector<A*> *_newA = static_cast< vector<A*>* >(buffer); //works

這有效嗎? 還有另一種方法嗎?

您應該只具有一個std::vector<A*> ,然后當您希望在其中放入BC ,可以這樣做:

 std::vector<A*> vec;
 vec.push_back(b);

這將比您目前正在執行的任何操作都要好得多。

另外,根據指針的所有權語義,應使用std::unique_ptrstd::shared_ptr 擁有原始指針是不行的!!

這有效嗎?

不,這不對。 完全不確定,如果您訪問它會發生什么。

還有另一種方法嗎?

是。 這取決於您想做什么:

  1. 復制內容: std::copy(vecC.begin(), vecC.end(), std::back_inserter(vecA));

  2. 如果給定C*的容器或迭代器或任何其他派生類型,則創建一個充當A*隨機訪問容器的適配器

  3. 我確定還有其他解決方案,只需告訴我們您想做什么

在我看來,您似乎正在尋找對通用(模板)類型的協變支持。 C ++完全不支持此功能。 CLR和C#/ VB支持它,盡管僅在最新版本中支持。

盡管如此,要呼應他人的回應,您可能會吠叫錯誤的樹。 我的直覺是,您希望有一個指向A型對象的指針的向量……並且這種類型應包括虛方法和虛析構函數-必要時。 如果沒有更好地了解您要解決的高級問題,就不可能更具體地討論合適的替代方法,這在您的問題中並不明顯。

您可能需要知道的魔術詞是“協方差”和“逆方差”。 在這里查看一個非常相關的問題。

簡短的答案:沒有一種整潔,明智的方法可以僅通過強制轉換來進行您想要的轉換。 您將需要很長一段時間才能將新載體復制到舊載體的內容中。

但更重要的是:1.永遠不要在標准容器類型上使用new 2.不要傳遞指向標准容器類型的指針。 3.不要將原始指針傳遞給自己的對象,而應使用std::shared_ptr

在C ++ 11中,不要通過void*繞行,而只需使用reinterpret_cast

但是,您想要的轉換允許非常不好的事情

#include <iostream>
#include <vector>
using namespace std;

class Base {};

class Derived: public Base
{ public: int x; Derived(): x(42) {} };

int main()
{
    vector< Derived* >  v;
    Derived             d;

    v.push_back( &d );
    cout << v.back()->x << endl;        // 42

    vector< Base* >*    pbv =
        reinterpret_cast< vector< Base* >* >( &v );
    Base                b;

    pbv->push_back( &b );
    cout << v.back()->x << endl;        // indeterminate value
}

與將T**轉換為T const**大致相同(不允許,可能會帶來不好的事情)。 簡而言之,除非您確切知道自己在做什么,否則不要這樣做。 它的時間較長,嗯,這里沒有討論的余地,但是它涉及區分可變和不可變的集合,並且要非常小心。


編輯:正如其他人(未解決轉換問題)已經指出的那樣,一個實際的解決方案是A指針或智能指針的向量,然后使用C ++多態性(即虛擬成員函數)。

暫無
暫無

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

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