我有一些類,所有的接口都完全相同。這個接口定義了一些方法,其中一些是模板化的(類本身可能會或可能不會)。使用相同的接口傳遞不同類型的對象
所以界面看起來像這樣
class MyClass
{
public:
void Func1();
template <typename T>
void Func2(T param);
};
我有一些它需要符合本接口,但要避免必須在編譯時知道確切執行各種對象的功能。
顯然,默認的C++解決方案應該有一個基類型,所有這些類派生並傳遞一個指針,並使用多態性完成所有工作。
問題是模板化的成員函數不能是虛擬的,所以這個方法不能使用。我也想避免改變當前接口集合,因爲它們有很多,其中一些定義在我的項目範圍之外。
另一種解決方案是對使用這些對象的函數進行模板化,使它們專注於正確的類型。這可能是一個解決方案,但由於遺留需求,大量功能模板可能不可行(這是我不能做任何事情的事情,因爲客戶端代碼不是我負責的東西)。
我最初的想法是提供某種類型的載體類,它是類型中性的,並且在效果中包含了這裏的通用接口,並且有一個基類接口類來傳遞內部類型。
東西沿着
class MyInterface
{
public:
virtual void Func1() = 0;
};
template <typename T>
class MyImplementation
{
public:
virtual void Func1()
{
m_impl->Func1();
}
private:
T* m_impl;
};
線但同樣的模板成員函數似乎阻止這種做法。
我看了一下boost :: any和boost :: function類,我認爲它們可以提供某種解決方案,但它們似乎並沒有給我正確的答案。
那麼,有沒有人有任何建議或解決如何使這成爲可能,如果的確如此?就我個人而言,我傾向於對需要這些對象的各種功能進行模板化 - 因爲這是功能模板提供的 - 但認爲它值得首先進行調查。
在此先感謝
你真的想解決什麼問題? – 2010-07-19 14:45:20
我有很多函數採用符合這個接口的各種對象,但是想避免在編譯時需要知道確切的實現。 – 2010-07-19 14:57:40
您可以嘗試檢查有關您的主要問題的問題:如何解決虛擬模板功能問題。我知道我之前看到過這個問題。我不確定你是否會在那裏找到你的解決方案,但這將是一個好的開始。 – n1ckp 2010-07-19 15:09:05