2013-07-31 134 views
1

我有一個函數名爲反序列化,其作爲輸入:轉換無效*爲矢量<int>

int(*cmp)(void*,void*) 

所以,該類型的任何功能可作爲由函數的參數。

舉例來說,如果我有一個點的結構是這樣的:現在

typedef struct{ 
    int x, y; 
}Point; 

,對於這個我CMP功能是這樣的:

int point_cmp(void* _p1, void* _p2){ 
    Point* p1=(Point*)_p1; 
    Point* p2=(Point*)_p2; 
    return (!((p1->x==p2->x) && (p1->y==p2->y))); 
} 

這工作。

但我想爲矢量做到這一點。

我想寫一個vector_cmp函數,它可以像point_cmp一樣傳遞給反序列化。 所以,我已經嘗試了一些像這樣的事情,但它的錯誤:

int vector_int_cmp(void* _v1, void* _v2){ 
    vector<int> *v1 = vector<int> *_v1; 
    vector<int> *v2 = vector<int> *_v2; 
    auto diff = 0; 
    auto v1_it = v1->begin(); 
    auto v2_it = v2->begin(); 
    while(v1_it != v1->end() && v2_int != v2->end()){ 
     if(*v1_it != *v2_it) diff++; 
     v1_it++; 
     v2_it++; 
    } 
    if(0 == diff && (v1_it != v1->end() || v2_it != v2->end())) diff = 1; 
    return diff; 
} 

什麼是做這種正確的方法是什麼?

+2

你能解釋到底什麼是錯的?發生了什麼問題? – tohava

+11

這是C++。你不必玩那些'無效*'遊戲。 – juanchopanza

+0

你似乎在'vector_int_cmp'函數中缺少了一些圓括號。 –

回答

4

我想你是這樣做的,以滿足某種外部接口 (它會回調你的函數);在純粹的 C++中,應該永遠不需要這個。總之:

int 
vector_compare(void const* p1, void const* p2) 
{ 
    std::vector<int> const* v1 = static_cast<std::vector<int> const*>(p1); 
    std::vector<int> const* v2 = static_cast<std::vector<int> const*>(p2); 
    return *v1 < *v2 
     ? -1 
     : *v2 < *v1 
     ? 1 
     : 0; 
} 

應該是所有必要的。

3

直接的問題是你錯了。石膏,如果C風格的,應該是這樣的:

vector<int> *v1 = (vector<int> *) (_v1); 
vector<int> *v2 = (vector<int> *) (_v2); 

然後程序編譯和作品(一旦你也在循環改變v2_intv2_it,這是一個錯字)。

更大的問題是,你不應該在C++中做這樣的事情。魔術一般是C,而不是C++。在C++中,您可以使用像模板這樣的工具來編寫泛型代碼,並且您應該儘可能使用標準實現進行比較操作。毫不奇怪,std::vector有他們 - 雖然當然做自己的是一個很好的鍛鍊。

相關問題