我一直在学习C++,来自C#,我已经习惯了使用服务提供者:基本上是一个字典<类型,对象>。不幸的是,我无法弄清楚如何在C++中执行此操作。所以,这些问题基本上都是:C++服务提供商
我将如何让C++中的字典。
我如何使用'Type'与它,据我所知在C++中没有'Type'。
与上面相同,但带有'对象'。
谢谢!
我一直在学习C++,来自C#,我已经习惯了使用服务提供者:基本上是一个字典<类型,对象>。不幸的是,我无法弄清楚如何在C++中执行此操作。所以,这些问题基本上都是:C++服务提供商
我将如何让C++中的字典。
我如何使用'Type'与它,据我所知在C++中没有'Type'。
与上面相同,但带有'对象'。
谢谢!
我假设你正试图将一个类型映射到单个对象实例。你可以尝试的东西沿着这些路线:
#include <typeinfo>
#include <map>
#include <string>
using namespace std;
class SomeClass
{
public:
virtual ~SomeClass() {} // virtual function to get a v-table
};
struct type_info_less
{
bool operator() (const std::type_info* lhs, const std::type_info* rhs) const
{
return lhs->before(*rhs) != 0;
}
};
class TypeMap
{
typedef map <type_info *, void *, type_info_less> TypenameToObject;
TypenameToObject ObjectMap;
public:
template <typename T>
T *Get() const
{
TypenameToObject::const_iterator iType = ObjectMap.find(&typeid(T));
if (iType == ObjectMap.end())
return NULL;
return reinterpret_cast<T *>(iType->second);
}
template <typename T>
void Set(T *value)
{
ObjectMap[&typeid(T)] = reinterpret_cast<void *>(value);
}
};
int main()
{
TypeMap Services;
Services.Set<SomeClass>(new SomeClass());
SomeClass *x = Services.Get<SomeClass>();
}
在C++类型不是在自己的权利的第一类对象,但至少类型名称将是唯一的,所以您可以通过这把钥匙。
编辑:名称实际上并不保证是唯一的,所以请坚持type_info指针并使用before方法来比较它们。
字典听起来像一个STL地图给我:std::map<K, T>
。看一下标准模板库 - 它很棒。它一直是ANSI C++的一部分。如果我没有记错的话,微软在PJ Plauger上有很好的实现。
你可能想看看STL map template。 C++肯定有类型(如果没有它,很难继承),只是没有具体定义的“Type”类。
STL有两个关联容器:std::map<K,V> and
std :: multimap。还有std::set<V>
,它应该是std::map<V,void>
的适配器,但正因为如此,它不是关联容器。 multimap与地图类似,只允许在同一个容器中使用多个相同的键。 map和multimap都包含std::pair<K,V>
类型的元素。换句话说,std::map<K,V>::value_type == std::pair<K,V>
,但是std::map<K,V>::key_type == K
和std::map<K,V>::mapped_type == V
。
至于“类型”,我不完全确定你的意思。如果你的意思是参数化的类,那么C++就会调用这个“模板编程”或者“泛型编程”。在上面,std::map<K,V>
是通过K和V对键的类型和值的类型进行参数化的。 C++还支持模板函数:
template<typename T>
void f(T o);
将声明一个函数,它根本不包含任何类型的参数,包括基本类型。 C++不支持泛型类型解析,因此类型T必须具有某种层次结构。现在,你所能做的只是假设传入的类型确实是正确的层次结构,并且如果你试图在该类型的对象上调用一个非声明函数,编译器就会抱怨。
template<typename T>
void f(T o) {
o.do_it();
}
上面将只要T定义的方法do_it()
工作。
模板注释未通过;应该读std:map –
duffymo
2009-01-05 02:52:04
使用`std :: map`而不是 –
2009-01-05 02:52:54