我一直在学习C ++,来自C#,我已经习惯使用服务提供者:基本上是一个Dictionary <!> lt; Type,object <!> gt;。不幸的是,我无法弄清楚如何在C ++中做到这一点。所以问题基本上是:

  1. 如何在C ++中创建字典。

  2. 我如何使用'Type',据我所知,C ++中没有'Type'。

  3. 与上述相同,但使用'object'。

  4. 谢谢!

有帮助吗?

解决方案

我假设您正在尝试将类型映射到单个对象实例。你可以尝试这些方面:

#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 == Kstd::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实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top