2012-03-21 55 views
1

我不得不爲一些舊的,寫得不好的代碼添加新的功能。有50個不同的列表需要在屏幕上顯示和處理,而且它們的當前代碼都是剪切和粘貼的,只需對2種不同類型進行小的修改,一種是DAO數據庫中的列表,另一種是地圖中的。將具有不同值類型的地圖傳遞給C++中的函數

我編寫了一個搜索類,它提供了每個列表類型的功能和幫助類,以提供搜索所需的基本功能。映射助手類只需要訪問tstring Key,它不需要不同的對象值。但是,我無法得到這個編譯。

由於各種不同的對象沒有關係,我定義了一個基本上爲空的類SearchValue,並將它作爲所有不同對象類的超類添加到.h中。

作爲一個例子,這裏是地圖定義之一:

typedef map<tstring, MyPatListEntry *, tstringcomp> patlist; 

MyPatListEntry定義:

class MyPatListEntry : public SearchValue { 

,我已經函數定義爲:

ListHelper(map<tstring, SearchValue *> *map, CString fieldName) 

的編譯器(VC++)給出了ListHelper()的定義都不處理所有參數的錯誤。如果我在編譯工作的定義中將SearchValue替換爲MyPatListEntry,那麼基本格式是正確的。

我在網站上看了一圈,發現人們建議這種類型的事情要用功能模板來完成,我想這會起作用,但我很好奇這樣做是否有某種原因不起作用。

感謝您的任何想法。

+0

它不起作用的原因是雖然'MyPatListEntry'的類型是'SearchValue','map '是不是'map '類型。 – Dialecticus 2012-03-21 11:18:03

回答

3

你要求的是叫做協變類型參數在C#世界(不可能在C++中),甚至在那裏它不會在你的情況下工作。原因其實很簡單。

想象一下下面的代碼:

class B {}; 
class D1 : public B {}; 
class D2 : public B {}; 

map<string, D1 *> myMap; 
D2 someObject; 

void myFunc(map<string, B *> & someMap) 
{ 
    someMap["foo"] = &someObject; 
} 

你不允許用myMap調用myFunc的,因爲這個問題的參數。您可以將D2類型的someObject分配到應該包含D1的地圖中。

+0

這在C#中可能嗎? – 2012-03-21 12:15:17

+0

這是一個很好的觀點。那麼如果它是「void myFunc(const map &someMap)」呢? – russell 2012-03-21 12:38:18

+0

@David在C#中,您可以將一些泛型類型參數僅限制爲_input_或僅限於_output_。例如,你可以有一個'MapReader '通用接口,只能用於檢查某些底層地圖。僅作爲輸出參數,您不允許在MapReader中創建或複製或接受這些類型的參數對象,以作爲交換將'MapReader '隱式轉換爲'MapReader ' – Fiktik 2012-03-21 12:56:27

0

如果你真的需要ListHelper有過不同SearchValue類型不同的行爲,也可適當在地圖的值類型模板功能:

template <class AnySearchValue> ListHelper(map<tstring, AnySearchValue *> *map, CString fieldName) 

這很難說,如果沒有看到是可行的更多的實施。 (哎呀對不起,在你說的OP中錯過了你認爲是這樣的)

相關問題