我一直在学习 C++,来自 C#,在那里我习惯了使用服务提供者:基本上是 Dictionary<Type, object>。不幸的是,我不知道如何在 C++ 中做到这一点。所以问题基本上是:
我将如何用 C++ 制作字典。
据我所知,C++ 中没有“类型”,我将如何使用“类型”。
与上面相同,但带有“对象”。
谢谢!
我一直在学习 C++,来自 C#,在那里我习惯了使用服务提供者:基本上是 Dictionary<Type, object>。不幸的是,我不知道如何在 C++ 中做到这一点。所以问题基本上是:
我将如何用 C++ 制作字典。
据我所知,C++ 中没有“类型”,我将如何使用“类型”。
与上面相同,但带有“对象”。
谢谢!
我假设您正在尝试将类型映射到单个对象实例。您可以尝试以下方法:
#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++ 确实有类型(没有它就很难继承),只是没有具体定义的“类型”类。
STL 有两个关联容器: std::map<K,V> and
std::multimap。还有std::set<V>
which 应该是 的适配器std::map<V,void>
,但因此它不是关联容器。multimap 类似于 map,只是它允许在同一个容器内有多个相同的键。map 和 multimap 都包含 type 的元素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()
。
对我来说,字典听起来像是 STL 映射:std::map<K, T>
. 看看标准模板库——它很棒。一段时间以来,它一直是 ANSI C++ 的一部分。如果我没记错的话,微软从 PJ Plauger 那里得到了一个很好的实现。