2011-11-05 56 views
0

该键将是一个字符串,并且该值将是任何类型的向量。是否可以创建一个向量图,其中向量可以是任何类型的?

例如,第一个键可以映射到整数的矢量,第二个键可映射到浮点的矢量。在C++中可能吗?

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

+2

更迫切的问题是为什么你认为你需要这个。 – delnan

+0

基本上没有。通过其他手段?绝对。为什么? –

+0

它可以完成,但可能不应该。这是纯粹的学术,还是你想做点什么? – Beta

回答

1

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

std::map<std::string, std::vector<boost::any> > 
+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>>然后。

+0

或者'map '...可能效率更高,因为它存储的鉴别器更少。 –

+0

@John:可能,但泽维尔特别询问了一个映射到向量:) – fredoverflow

+0

取决于哪一个更重要 - 值被类型限制为向量,或者向量一旦找到它就受到类型的约束。 –

1

一个vector<T>的值都必须是同一类型T和一个map<K,V>的值都必须V类型,是vector<T>一些T的,所以,不,不开箱的,但你可以得到周围的类型为Boost.Any库。

2

boost :: any解决方案似乎对我来说是一个黑客攻击。我建议你看看你的渲染器的面向对象设计。

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

然后,你的数据结构问题尚未完全解决,你可以这样做:

std::map<std::string, Buffer> 

好运。

相关问题