我一直在学习C ++,来自C#,我已经习惯使用服务提供商:基本上是一个字典< Type,object>。不幸的是,我无法弄清楚如何在C ++中做到这一点。所以问题基本上是:
如何在C ++中创建字典。
我如何使用'Type',据我所知,C ++中没有'Type'。
与上述相同,但使用'object'。
谢谢!
答案 0 :(得分:5)
我假设您正在尝试将类型映射到单个对象实例。你可以尝试这些方面:
#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方法进行比较。
答案 1 :(得分:3)
您可能想查看STL map template。 C ++肯定有类型(没有它就很难继承),只是没有特定的“类型”类。
答案 2 :(得分:2)
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()
。
答案 3 :(得分:0)
字典听起来像是STL地图给我:std::map<K, T>
。看看标准模板库 - 它很棒。它已经成为ANSI C ++的一部分了一段时间。如果我没记错的话,微软有一个很好的PJ Plauger实现。