2010-01-07 34 views
3

標題可能是誤導,但我真的不知道如何命名它。C++獲取動態泛型類型的指針?

讓我們說,我有以下結構

template <typename T> 
struct SillyBase{ 
    void doFunnyStuff(vector<T> vec){ 
     dummyField = T(); 
     for(int i=0; i<10; i++) 
      vec.push_back(dummyField++); 
    } 
    T dummyField; 
}; 

struct A : public SillyBase<char>{}; 

struct B : public SillyBase<float>{}; 

現在讓我們進一步假設我有一個指針

ISillyBase* ptr; 

其中指向器的新生代類的對象(A或B)SillyBase的 - 但是,我不知道哪一個(我只知道它是A或B);

有沒有辦法讓我打電話給doFunnyStuff()?

也許是這樣的:

vector<dynamic_generic_type_of(ptr)> vec; 
ptr->doFunnyStuff(vec); 

的感謝!

+0

由於關於如何調用'ptr'方法的問題是基於有缺陷的前提,因此可以根本不需要聲明'ptr',因此投票結束爲*不再相關*。 – 2010-01-08 00:05:22

+0

手頭有什麼更大的問題? – GManNickG 2010-01-08 00:11:30

+0

你希望傳入什麼類型的矢量?你想收集什麼樣的價值?你會期望在向量中存儲char和float嗎?所以你會將它們轉換爲一種類型......可能有一個簡單的解決方案來解決你的問題,但我們不知道你想解決的問題是什麼 – stefanB 2010-01-08 00:16:01

回答

1

在你的榜樣,你不能有SillyBase*因爲SillyBase被定義爲

template <typename T> struct SillyBase {...} 

所以你需要提供類型...

另一個問題是,你傳遞的vector<T>進入副本doFunnyStuff()您然後填充...這似乎並不正確,因爲當該方法返回你失去vec,是它應該是參考vector<T>&

+0

你可以在ISillyBase中使用虛擬doFunnyStuff,但問題是它需要知道參數的類型......所以它不能是虛擬的......也許可以解釋你想要達到的目標,並且可能有更簡單的解決方案。 – stefanB 2010-01-08 00:06:54

+0

好吧 - 它不會那樣工作:) – genesys 2010-01-08 00:08:39

0

編輯:即使ISillyBase,也沒有虛擬模板成員這樣的事情,所以你將無法定義一個需要vector<T>參數。


在你的榜樣

那麼,有沒有這樣的非模板類型SillyBase因此你不能聲明SillyBase* ptr;

而在最後,我實在不明白你想達到什麼樣的:/

0

SillyBase *ptr;甚至不應該編譯。沒有模板參數列表,SillyBase不是一個類型,所以試圖在需要類型的上下文中使用它將會失敗。

由於您無法首先創建指針,因此如何取消引用並沒有真正的答案。

0

這些實際上是兩個完全不同的類。在100年前的阿姨婚禮上遇到的班級中,沒有辦法通過名字稱呼功能。你必須重新設計解決方案,包括對你的模板類 一些基類,像

class SillyBaseBase 
{ 
    public: 
     void function doFunnyFunnyStuff(SillyBase<char> *) 
     { 
      SillyBase<char>::doFunnyStuff(); 
     } 

     void function doFunnyFunnyStuff(SillyBase<float> *) 
     { 
      SillyBase<float>::doFunnyStuff(); 
     } 

} 
0

我想你要尋找的是內置的dynamic_cast的模板函數。它動態確定數據結構的類型,如果不是實例化則返回null。語法是

dynamic_cast<the_template_definition>(the_template_instantiation) 

一個重要的問題是模板類必須從一個公共虛擬類派生。所以,做你想做什麼,你可以使用下面的代碼:

#include <stdio.h> 
class Top /* The parent class */ { 
public: 
virtual ~Top() {}; // You need one base virtual function in the base class 
}; 

template <typename T> class SillyBase : public Top { 
    void doFunnyStuff(T dummyVar){ 
     dummyField = dummyField + dummyVar; 
    } 
    T dummyField; 
}; 

class A : public SillyBase<char>{}; 
class B : public SillyBase<float>{}; 

int main(){ 
    A a; 
    Top *ptr = (Top*)(&a); 
    if(dynamic_cast<A*>(ptr) != NULL) 
     printf("ptr is of type A*\n"); 
    if(dynamic_cast<B*>(ptr) != NULL) 
     printf("ptr is of type B*\n"); 
    return 0; 
} 

程序的輸出將是:

ptr is of type A* 
0

我可能會用的dynamic_cast關鍵字去。儘管在聲明矢量時會遇到問題。它必須是SillyBase類型。問題在於,這需要使用模板參數,這是未知的,也是不可能的。在過去,爲了解決這個問題,我只把矢量放在Base類的Base類中,然後提供一個函數來修改它。 Inheireted類將在基類中提供與矢量名稱相同的變量。 Inheireted類,inheiriting的基類的功能將有望填補正確的載體。我不知道這是一個好主意還是壞主意,但這是我試圖在我的項目中克服這個問題的方式。