我正在爲我們在其他代碼中定義的一堆類編寫泛型包裝類。我試圖弄清楚C++中是否有方法來編寫一個可以將模板參數存儲爲變量的模板類。下面是我想看到什麼工作的一個例子:C++商店模板參數作爲變量
template < class C > class generic {
public:
C obj; // used for custom type processing
template < class T > T other; // <- changeable variable (or something)
template < class T > setOther() { // Function to change variable
// code to change variable type, or set type
}
void doSomethingWithOther() {
// do some processing for other, like call
// specific member function or something
(((other*)obj)->*SomeGenericMethod)()
}
}
int main(int argc, char **argv) {
Bar bObj;
generic<Foo> fObj;
fObj.setOther<Bar>();
fObj.doSomethingWithOther();
return 0;
}
我知道上面的代碼將不能編譯的原因有很多,但我的問題更多的是關於功能。有什麼方法可以將模板參數存儲爲一個變量(或使用函數或其他東西),然後稍後可以將它用作類型說明符?如果沒有一個標準的方式,來自SO社區的任何想法都可能導致我期望的結果?
請不要升壓或其他第三方庫,我試圖保持它作爲「STL」(C99)儘可能。
另一個想法我是使用默認的專業化:
template < class C, class T = void* > class generic {
public:
C obj;
T other;
// ... more code
}
,但在那種情況下,假設我們有以下幾點:
class Test1 {
public:
generic<Foo> *G1;
generic<Foo, Bar> *G2;
};
如果我想以後改變G1的類型做一些其他處理,我可以這樣說:
G1 = new generic<Foo, Bar>(); // compile error, different types
但是,這會導致編譯錯誤,因爲指向的兩種類型是不同類型的(G1是generic<C>
類型,另一種類型是generic< C, T >
,即使模板類T
默認爲void*
。
對不起,很長一段文章,我想盡可能清楚我的意圖與此代碼。同樣,請隨時糾正我在我上面的任何言論(長期=對我來說較少的大腦活動)
在此事先感謝您的任何幫助。
編輯1:
爲了澄清,所述other
數據成員是僅僅有顯示我想該部件保持一個類的類型。這是因爲我們的代碼有其他類的成員調用實例化成員函數。如果我要調用一個不同類的成員函數,我會得到一個編譯錯誤。
不幸的是我不能使用任何C++ 0x功能,因爲我們的嵌入式編譯器比較老,不支持0x功能集。否則,這將是明顯的解決方案。
我基本上不必建立在委託類型系統,以使得實例化的類可以自身內和稱爲成員函數調用從其他實例化類的成員將具有存儲空間,並獲得了this
指針
例如:
class Foo {
public:
Delegate other;
}
class Bar {
public:
void SomeFunction() {
std::cout << "hello from Bar::SomeFunction, data = " << data << std::endl;
}
int data;
}
int main() {
Foo F;
Bar B;
B.data = 10;
F.other = Delegate::attach<Bar>(&Bar::SomeFunction, &B);
// Delegate::attach is defined as
// template < class T > Delegate attach(void (T::*fnPtr)(void*), T *obj)
F.other();
}
在上面的例子中Delegate
類的void operator()()
然後調用其他成員函數,經由(*fnPtr)()
。如果這樣調用,該函數將無法訪問其成員數據(不知道this
指針)。如果調用傳遞引用對象(即(*fnPtr)(obj)
),該功能現在可以訪問成員數據。
我試圖通過指定一個通用的class type
對象來解決這個問題,然後可以將Delegate other
連接到任何成員。
什麼會'other'依賴,以確定它是什麼? – 2012-01-16 20:35:44
¤「請勿使用Boost或其他第三方庫」是自我毀滅的。你不想重新發明這個輪子,所以使用boost :: any或boost :: variant(我忘記了哪個是哪個)。或者使用該源代碼作爲起點,但不太可能改進它:使其無法提升的修改只會降低質量。無論如何,你爲什麼要這個?它確實看起來像**,你問的是一個預想的解決方案**,而不是詢問有關問題。如果是這樣,請詢問有關問題。 Cheers&hth。, – 2012-01-16 20:35:48
「儘可能保持STL」(我假設你的意思是C++標準庫):你知道標準受Boost及其作者的影響嗎? – pmr 2012-01-16 20:40:39