2016-04-08 68 views
1

我有一點遺傳/模板問題。我試圖創建一個接口IBinding,它由TcpClientTcpServer(將會有2-3個不同的TcpServers,它們只在接受連接請求後產生的流類型(套接字抽象)不同。C++在一個類中使用模板和虛擬方法

下面是一個簡化的例子:

接口:

struct IBinding 
    { 
     virtual ~IBinding() {} 

     virtual void bind(const std::string endpoint) = 0; 

     virtual void terminate() = 0; 
    }; 

    typedef std::shared_ptr<IBinding> TBindingPtr; 

部首:

#include "IBinding.h" 

class TcpServer : public IBinding 
{ 
public: 
    TcpServer(); 
    ~TcpServer(); 

    virtual void bind(const std::string endpoint); 

    virtual void terminate(); 

}; 

實施:

#include "TcpServer.h" 
#include "StreamTypeA.h" 
#include "StreamTypeB.h" 

TcpServer::TcpServer() { } 

TcpServer::~TcpServer() { } 

void TcpServer::terminate() {   } 

void TcpServer::bind(const std::string endpointStr) 
{ 
     auto stream = std::make_shared<StreamTypeA>(); // Here I need to use different types depending on the server implementation 

} 

現在,我想創建一個TcpServer的兩個實例,並呼籲他們.bind(),但他們應該創建不同類型的流。

一個)據我所知,這是不可能的類型傳遞給bind()方法在C++中試圖定義bind方法模板也不起作用參數

b)中,因爲它是虛擬

template<class TSocket> 
    virtual void bind(const std::string endpoint); 

三)我很可能只是創建的TcpServer

兩種不同的實現有另一種方式?沒有辦法用模板做到這一點嗎?

+0

[OT]:你可能想'const std :: string&'而不是'const std :: string'。 – Jarod42

+0

如果'bind'方法不能既是'template'又是'virtual',類'TcpServer'可能是帶'virtual'方法bind的模板。 – Jarod42

回答

4

編號模板函數本質上與虛擬調度不兼容。你不能覆蓋它們。他們可以隱藏名字,但這可能不會幫助你。因此,您需要爲將使用的每種流類型提供虛擬功能,或者爲可在IBinding級別使用的流類型創建抽象。

+0

謝謝!我對所有的流類型都有一個'IStream'接口,但是我仍然需要在'bind()'方法中創建一個具體的Stream對象,所以我想我必須得到你的第一個建議? – user66875

+0

@ user66875 - 你爲什麼需要在bind中創建它?爲什麼它不是一個參數?一般來說,如果你認爲你需要打破語言才能完成任務,那麼你不需要。 –

+0

坦率地說,我真的不得不懷疑,你需要這樣做,因爲你聲明的計劃是將類型作爲模板參數傳遞。如果您打算讓函數調用找出參數的類型,但這不符合您所述的目標,那將會更容易理解。所以只需將它作爲指針或引用傳遞給base並完成即可。 –