2012-02-25 93 views
6

的通用集合我是C++的新手,但不幸的是我不能停止在C#(我的前語言)中思考。 我讀過一些書籍,論壇和C++參考網站,但是我找不到我的問題的答案,所以我想我不妨在放棄和寫一些難看的東西之前嘗試在這裏。C++正確的方式返回類型爲

好的,我們可以開始。 我有一個抽象方法類succesors函數我希望它返回指針集合狀態。我不想強制執行者到一個特定的容器;我寧願讓他們選擇(矢量,列表等)。

所以它看起來像這樣:

class Problem 
{ 
public: 
    virtual list<const State*>::iterator succesorsFunction(const State &state, list<const State*>::iterator result) const = 0; 
}; 

這裏的問題是明確使用名單。你如何在C++中做到這一點?

我想過使用模板,但後來我遇到了兩個問題: 1)好像你不能用抽象的方式做到這一點(或我錯了) 2)我如何告訴模板應該包含指針?國家?

+2

Boost.Range的類型擦除範圍可能有助於在這裏。 – Xeo 2012-02-25 01:37:12

+0

你可以擴展這個功能,它是虛擬的應該實現?可能有其他方法。 – 2012-02-25 01:42:28

+2

所以你想返回類似於'IEnumerable '的東西嗎? – svick 2012-02-25 01:53:17

回答

2

您不能在C++中基於返回類型重載方法。另外,C++中的「容器」沒有相同的基礎(例如Java中的Collection),所以不能返回通用容器。

恐怕沒有乾淨的做法。

我只會寫重載(通過參數)或不同的函數名稱。

對於您的問題:

1)您可以。是什麼讓你覺得你不能?

2)您聲明的相同方式listlist<const State*> - const是可選的。

+4

我不認爲他說什麼通過返回值重載;有多種具有相同返回類型的實現。他只是希望返回類型足夠一般,不會限制實現。 – 2012-02-25 01:36:42

+0

@ ErnestFriedman-Hill他的問題是他想要返回一個集合,但他不想限制集合(儘管代碼返回一個迭代器)。 – 2012-02-25 01:38:32

+0

...沒有說什麼關於通過返回類型重載。 – 2012-02-25 01:40:58

0

你不能有一個成員函數模板,該模板是虛擬的,但你可以嘗試實現朋友這樣的通用功能:

template <typename yourType> 
yourType& succesorsFunction(const State &a, yourType &result){//Your return type can be without reference 
    //Your body 
    return result; 
} 

如果你打電話給你,例如函數vector<State> a的說法是這樣的:

sucessorsFunction(b,a);// b is your State object 

扣除過程會自動推斷yourType實際上是vector<State>類型,我認爲這可以解決您的問題。此外,此架構還支持您創建新的類類型MyVector(其中包含States的數組)並將MyVector對象傳遞給succesorsFunction

+0

我試圖做到這一點,但它不適用於抽象方法。我最好在最後刪除= 0並結束。感謝您的回覆 – wolfovercats 2012-02-25 02:38:30

+0

@wolfovercats如果您不知道類型,您將如何填充結果? – 2012-02-25 02:39:54

+0

@LuchianGrigore我知道類型;它是國家*。 – wolfovercats 2012-02-25 02:41:15

0

如果你真的想強制STL容器使用,請嘗試以下操作:

template <template <typename, 
        typename = std::allocator<const State *> > class Container> 
Container<const State*> successorsFunction(const State &state, const Container<const State*> &c) const 
{ 
    // return something useful. 
} 

如果你堅持有這個功能是虛擬的,那麼它不可能是一個成員函數模板,只需用它超載你打算支持的類型,那麼你可以讓它們變成虛擬的。

0

這只是一個闡述到C.T's的答案。請記住,如果你返回一個指針的容器,那麼你將不得不明確地釋放它們或使用std::unique_ptr
只是一個FYI ..因爲你是從C#背景。

您也可以使用State或templatize。

template<typename Type, 
     template< typename, typename = std::allocator<Type*> > class Container 
     > 
Container<Type*> Successor(const Type& x) 
{ 
    Container<Type*> cont; 
    // something. 
    cont.push_back(new Type(x)); 
    return cont; 
} 

,並調用它

vector<State*> states = Successor<State, vector>(State(10));