题
我一直在学习C ++,来自C#,我已经习惯使用服务提供者:基本上是一个Dictionary <!> lt; Type,object <!> gt;。不幸的是,我无法弄清楚如何在C ++中做到这一点。所以问题基本上是:
-
如何在C ++中创建字典。
-
我如何使用'Type',据我所知,C ++中没有'Type'。
-
与上述相同,但使用'object'。
醇>
谢谢!
解决方案
我假设您正在尝试将类型映射到单个对象实例。你可以尝试这些方面:
#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地图模板。 C ++当然确实有类型(没有它就很难继承),只是没有特定的<!>类型;类型<!> quot;类。
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 ++会调用这个<!>“模板编程<!>”,或者<!>“Generic Programming <!>”。在上面,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()
。
字典听起来像是我的STL地图:std::map<K, T>
。看看标准模板库 - 它很棒。它已经成为ANSI C ++的一部分了一段时间。如果我没记错的话,微软有一个很好的PJ Plauger实现。