键是一个字符串,值将是任何类型的向量。
例如,第一个键可以映射到int的向量,第二个键可以映射到浮点向量。这可能在c ++中吗?
如果没有办法,我可以通过其他方式达到类似的效果吗?
答案 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>
的值必须全部属于同一类型T
且map<K,V>
的值必须全部为V
vector<T>
对于某些T
,所以不,不是开箱即用,但你可以使用Boost.Any库绕过类型系统。