2012-07-23 121 views
2

我想創建一個類來將輔助數據存儲在任意對象中 - 這是乾淨的方式嗎?C++類中的任意數據類型

class A{ 
    std::string _name; 
    int _val; 
    void * _extraData; 

    //I want to implement these methods 
    void setExtraData(void * data){ 
     // 
    } 

    void * getExtraData(){ 
    } 
}; 


class B{ 
    std::vector<A *> v; 

    void foo(){ 
     //use A here - _extraData will  
     //be a (say) a vector<int> 
    } 
}; 
+1

'boost :: any'很好。 – chris 2012-07-23 17:55:00

+3

...但適當的縮進比較好。 – 2012-07-23 17:55:30

回答

7

我將與boost::variant,如果你有一組已知的類型或boost::any如果沒有啓動。你可以隨時評估你的設計,看看抽象接口的多態性是否也可以解決你的問題(有時它並沒有幫助)。有關您試圖解決的實際問題的更多細節可能有助於獲得更好的答案。

+0

@Mark謝謝 - 我其實沒有一套已知的類型 - 可以是任意的。目標是比B級維護A的每個實例的輔助數據的實現更清晰。 – Raghu 2012-07-23 18:02:24

0

模板,如果你知道在編譯時的數據類型將被使用:

template typename T 
class A{ 
    std::string _name; 
    int _val; 
    T _extraData; 

    void setExtraData(T data){ 
    } 

    T getExtraData(){ 
    } 
}; 

class B{ 
    std::vector<A<int> *> v; 
    void foo(){ 
    } 
}; 

如果你不知道在編譯的時候做的,即它取決於例如用戶輸入而不是unionboost::any(由@chris提議)是解決方案。