2012-10-04 64 views
3

在C++中,假設我具有在一個通用的結構包裹的消息的消息傳送系統:在一個接口傳遞的通用結構類型作爲參數

template<typename T> 
struct Message 
{ 
    std::string Name; 
    T Data; 
}; 

我還具有包括需要使用的功能的接口此結構的純粹通用版本:

class Interface 
{ 
    public: 
    virtual ~Interface() { } 
    virtual void Receive(Message& message) = 0; 
    virtual Message Send() = 0; 
}; 

但是,Message不再指定類型;例如Message<float>Message<std::string>名稱類型。由於將要實施Interface的類將需要捕獲不同的Message,因此我不能只定義特定的類型。

我能想到解決這個問題的唯一方法是翻出模板並使用繼承,但隨後我會在我的代碼中散佈一些東西,如IntMessageBoolMessage,這看起來非常醜陋。關於如何以我想要的方式做到這一點的任何想法?

+0

「Message」的「純粹通用版本」有哪些屬性/方法?只是'名字'? –

回答

1

爲什麼不將界面定義爲模板?

template<typename T> 
class Interface 
{ 
    public: 
    virtual ~Interface() { } 
    virtual void Receive(Message<T>& message) = 0; 
    virtual Message<T> Send() = 0; 
}; 
+0

@twalberg目前還不清楚模板消息如何可能真的是虛擬的。 – juanchopanza

+0

@twalberg你不能有模板虛擬方法嗎? –

2

一個簡單的方法是將 Message類型分成層次:

struct MessageBase { 
    std::string Name; 
}; 
template<typename T> 
struct Message : MessageBase 
{ 
    T Data; 
}; 

然後,你可以通過 MessageBase&通過接口。

[以前不行。該函數將能夠接受任何MessageBase&對象,但Receive似乎是關於在參數中存儲編譯時類型未知的消息。但如果你不介意的動態分配,你可以有一個Message持有的名稱和一個指向一個MessageImpl和然後不同的實現(上面的模板)

另一種常見的方法是所有可能的消息添加到並且通過工會。