2012-10-07 42 views
0

我有從基礎結構派生的int模板結構。模板結構陣列

struct Base { int i; double d; }; 
template< int N > struct Derv : base { static const int mN = N; }; 

我需要柴油< N>其中N可以爲陣列中的每個結構變化的陣列。我知道C/C++不允許不同類型的對象數組,但是有沒有辦法解決這個問題?我想以某種方式分離類型信息(提示像指向基本結構或聯合彈簧使用我的腦海中,但所有這些我不知道如何存儲每個數組元素的類型信息用於使用期間編譯時間)。如您所見,每個Derv < N>的內存模式相同。

我需要在代碼中稍後訪問模板專用化的每個數組元素的類型。這一切的總體目標是有一個編譯時調度機制,而不需要在代碼中的某處執行運行時「類型切換」。

+0

目前我沒有看到任何有用的東西'Derv'是模板類。一個都沒有。所以首先你應該想知道你是否在問正確的問題。 –

+0

做「基地」的向量矢量,並完成。 –

+0

這個問題的關鍵是靜態分派的參數(我不想包含整個代碼,但總的來說,有些模板函數的行爲因Derv類型而異)。所有這些都發生在性能至關重要的代碼中,所以我寧願避免虛擬,函數指針和類似的東西。 –

回答

1

這是絕對不可能的。如果你沒有

int i; 
std::cin >> i; 
some_magic_array X[size]; 

那麼什麼是X[i]類型?哦,等等,你不可能知道。這沒什麼特別的C++,它是根本不可能的。這就是爲什麼沒有some_magic_array永遠存在,允許這一點。

除非您有效使用std::tuple並保證i是constexpr。那麼你絕對可以用std::get<i>(tup);來做到這一點。

+0

好吧,我會分析這個和Alexandrescu的類型列表,看看是否有幫助。謝謝你們。 –

1

我想你可以使用ptr = dynamic_cast<Type>(element); .. ptr將等於NULL如果它是錯誤的類型。 例如:

#include <map> 
#include <cmath> 
#include <vector> 
#include <string> 
#include <cstdlib> 
#include <fstream> 
#include <sstream> 
#include <iostream> 


using namespace std; 

struct Base { int i; double d; Base(){}; virtual ~Base(){};}; 
template< int N > struct Derv : public Base { static const int mN = N; ~Derv(){}; }; 

int main(int argc, char **argv){ 
    Base* arr[2]; 
    arr[0] = new Derv<10>; 
    arr[1] = new Derv<5>; 
    Derv<10> *ptr = dynamic_cast<Derv<10>* >(arr[0]); 
    Derv<5> *ptr2 = dynamic_cast<Derv<5>* >(arr[0]); 
    cout << ptr << endl << ptr2 << endl; 
    return 0; 
} 
// That should print 
0x9571008 //ptr to object will differ every time. 
0 // Null because of wrong type. 

但是,你需要在你的結構定義虛析構函數這個工作,和/或虛擬功能。

+0

是不是dynamic_cast <>僅適用於有虛擬結構的結構?另外,我需要在運行時檢查返回值,這相當於一個類型開關(我想避免)。 –

+1

是的,需要虛擬化..阿哈..那麼,你在想什麼來避免類型轉換,因爲你不知道數組元素的類型?! –

+0

通過模板專業化的靜態分派(在上面的評論之一中描述)。 –