2015-06-26 21 views
1

我有許多類都需要一個未指定類型的對象並返回一個固定類型的結果。此外,這些對象是模板化的,它改變了結果的計算。我想將這些對象隱藏在一個通用接口後面。下面的例子應該說清楚。 struct Work是接口,並存在多個類如struct WorkImpl。此外還有多種類型,如struct Astruct B,它們相互作用。在我的情況下,它們也是模板化的,不能是多態的。問題是如何將工作調用「轉發」給WorkImpl對象?使用模板化方法刪除類型

#include <iostream> 

struct Result 
{ 

}; 

struct Work 
{ 
    virtual ~Work() { } 

    template <typename U> 
// virtual Result work(const U& u) = 0; // this is not possible, of course! 
    Result work(const U& u) { std::cout << "Work" << std::endl; } 
}; 

struct B 
{ 

}; 

struct A 
{ 
    A& operator =(const B& b) { return *this; } 
    Result result() { return Result(); } 
}; 

template <typename T> 
struct WorkImpl : public Work 
{ 
    template <typename U> 
    Result work(const U& u) 
    { 
    std::cout << "WorkImpl" << std::endl; 
    T t; 
    t = u; 
    return t.result(); 
    } 
}; 

int main() 
{ 
    Work* w = new WorkImpl<A>(); 
    w->work(B()); 
    return 0; 
} 
+1

在各種實現中,對'work'內的'U'類型的變量做什麼?各種impls之間有什麼共同之處?你有一套固定的'A'' B'類型嗎?完全雙重調度類型擦除,基於兩個在擦除點沒有定義的獨立類型擦除,不是(據我所知)可以在C++中執行(基本上需要在dll世界中進行運行時編譯)。用於雙重調度虛擬函數的技巧有時可以在編譯時使用,但需要更多細節。 – Yakk

+0

對不起,「擦除點」有點含糊不清(「擦除點」可以說是用固定類型調用擦除碼的地方)。 「擦除代碼」可能會更好? (執行類型擦除的代碼)。我需要去學習類型擦除背後的更多的數學理論(我猜想類型理論的一些子集?),所以我可以說出那些意味着事物的詞。 – Yakk

+0

同意@Yakk。如果沒有進一步的限制,你想要達到的目標就無法解決 - 如果可能的話,他們會允許虛擬模板化方法。如果可能的類型'A'或'B'的集合很小,你可以通過重載而不是模板函數來解決你的問題(可以是虛擬的) – pqnet

回答

0

我真的不知道問題是什麼。

代碼編譯。

你不想多態性但

  • 你忘了靜態多態性也多態性
  • 你無償使用繼承,儘管有所有
沒有統一的接口

我建議只從界面中獲取參數。鍵入擦除的最簡單方法是使用std::function<Result()>並完成。

如果需要,我可以添加一個小樣本。

+0

這不是更多的評論嗎? 「我不明白這個問題是什麼」,很難成爲問題的答案! – Yakk

+0

我必須同意,這看起來更像是評論,而不是對我的回答。 – Puppy

+0

@Yakk號他問的是如何在他想做的事情上輸入刪除內容。 'std :: function '答案。其餘的只是有用的筆記,是的 – sehe