是否可以创建矢量图,其中矢量可以是任何类型的?

时间:2011-11-05 16:39:07

标签: c++

键是一个字符串,值将是任何类型的向量。

例如,第一个键可以映射到int的向量,第二个键可以映射到浮点向量。这可能在c ++中吗?

如果没有办法,我可以通过其他方式达到类似的效果吗?

4 个答案:

答案 0 :(得分:2)

嗯,你可以这样做:

std::map<std::string, std::vector<boost::any> >

但这不太可能是你真正想要的。为什么你认为你需要这个?

  

我有一个opengl渲染器,目前用java编写,但被移植到c ++。在这个渲染器中,我试图隔离可以特别改变缓冲区和着色器的部分。所以我有一个registerBuffer和registerShader函数。 registerBuffer函数将着色器变量名称(字符串)映射到缓冲区。但缓冲区可以是GLfloat或GLushort。所以现在我希望能够将着色器变量名称映射到GLfloat或GLushort的向量。

那么,你可以使用std::map<std::string, boost::variant<GLfloat, GLushort>>

答案 1 :(得分:2)

提升::任何解决方案对我来说都是一个黑客攻击。我建议您研究渲染器的面向对象设计。

你需要的是一个将字符串键和缓冲区作为值的映射,对吗?然后编写一个Buffer类,它可以在内部保存任何类型的OpenGL缓冲区,并使每个实例跟踪它所拥有的缓冲区的类型。此类的数据存储可以是通用void*,然后在需要将缓冲区发送到OpenGL时将其转换为正确的类型。

然后,您的数据结构问题已完全解决,您可以执行以下操作:

std::map<std::string, Buffer>
祝你好运。

答案 2 :(得分:1)

任何类型?您可以考虑使用Boost.Any。然后你的类型将是:

std::map<std::string, std::vector<boost::any> >

答案 3 :(得分:1)

vector<T>的值必须全部属于同一类型Tmap<K,V>的值必须全部为V vector<T>对于某些T,所以不,不是开箱即用,但你可以使用Boost.Any库绕过类型系统。