1

我一直在学习 C++,来自 C#,在那里我习惯了使用服务提供者:基本上是 Dictionary<Type, object>。不幸的是,我不知道如何在 C++ 中做到这一点。所以问题基本上是:

  1. 我将如何用 C++ 制作字典。

  2. 据我所知,C++ 中没有“类型”,我将如何使用“类型”。

  3. 与上面相同,但带有“对象”。

谢谢!

4

4 回答 4

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 方法来比较它们。

于 2009-01-05T03:16:28.063 回答
3

您可能想查看STL 映射模板。C++ 确实有类型(没有它就很难继承),只是没有具体定义的“类型”类。

于 2009-01-05T02:52:54.990 回答
2

STL 有两个关联容器: std::map<K,V> andstd::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 == Kstd::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()

于 2009-01-05T03:02:03.663 回答
0

对我来说,字典听起来像是 STL 映射:std::map<K, T>. 看看标准模板库——它很棒。一段时间以来,它一直是 ANSI C++ 的一部分。如果我没记错的话,微软从 PJ Plauger 那里得到了一个很好的实现。

于 2009-01-05T02:51:12.107 回答