我有許多類都需要一個未指定類型的對象並返回一個固定類型的結果。此外,這些對象是模板化的,它改變了結果的計算。我想將這些對象隱藏在一個通用接口後面。下面的例子應該說清楚。 struct Work
是接口,並存在多個類如struct WorkImpl
。此外還有多種類型,如struct A
和struct 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;
}
在各種實現中,對'work'內的'U'類型的變量做什麼?各種impls之間有什麼共同之處?你有一套固定的'A'' B'類型嗎?完全雙重調度類型擦除,基於兩個在擦除點沒有定義的獨立類型擦除,不是(據我所知)可以在C++中執行(基本上需要在dll世界中進行運行時編譯)。用於雙重調度虛擬函數的技巧有時可以在編譯時使用,但需要更多細節。 – Yakk
對不起,「擦除點」有點含糊不清(「擦除點」可以說是用固定類型調用擦除碼的地方)。 「擦除代碼」可能會更好? (執行類型擦除的代碼)。我需要去學習類型擦除背後的更多的數學理論(我猜想類型理論的一些子集?),所以我可以說出那些意味着事物的詞。 – Yakk
同意@Yakk。如果沒有進一步的限制,你想要達到的目標就無法解決 - 如果可能的話,他們會允許虛擬模板化方法。如果可能的類型'A'或'B'的集合很小,你可以通過重載而不是模板函數來解決你的問題(可以是虛擬的) – pqnet