2012-07-23 119 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提议)是解决方案。