c ++:使用type作为地图/字典的键?

时间:2013-11-18 20:38:00

标签: c# c++ templates types

我的一个C#课程中有以下成员:

private static Dictionary<Type, List<long>> bindings = new Dictionary<Type, List<long>>();

[...]

/// <summary>
/// Register an Action for a specific event type
/// </summary>
/// <typeparam name="T">Event type</typeparam>
/// <param name="handler">Action to be executed when a message was recieved</param>
/// <returns>Listener ID</returns>
public static long Register<T>(Action<Event> handler) where T : Event
{
        if(handler == null)
            throw new ArgumentException("Provided handler is null");
        listeners.Add(nextListenerId, handler);

        AddBinding<T>(nextListenerId);
        nextListenerId++;
        return nextListenerId-1;
}

[...]

    private static void AddBinding<T>(long id) where T : Event
    {
        List<long> b;
        if (!bindings.TryGetValue(typeof(T), out b))
        {
            b = new List<long>();
            bindings.Add(typeof(T), b);
        }
        b.Add(id);

    }

我是c ++(有点)的新手,我真的不确定,如何将其翻译成c ++(特别是类型的东西)。

我尝试将type_info用作地图中的键,但这似乎不起作用

'std::pair<_Ty1,_Ty2>::first' uses undefined class 'type_info'
你可以给我一个暗示吗? 感谢。

1 个答案:

答案 0 :(得分:3)

假设您想要对标题中的问题给出答案(我无法理解C#代码):在C ++中,您可以使用std::type_index作为类型的键:您&#39; d使用typeid(x)将表达式x的类型作为std::type_info对象获取,然而,该对象不能轻易用作关键字。但是,您可以为此对象构建std::type_index,可以将其用作关键字,例如std::map<K, V>

还有另一种将类型映射到整数的方法,这种方法也很有效,尽管下面写的T constT形式会得到不同的值(这可以通过在实际之前对类型进行规范化来增强获得整数):

inline int next_type_key() {
    static int rc = 0;
    return rc++;
}
template <typename T>
int type_key() {
    static int rc = next_type_key();
    return rc;
}

您可以使用例如

来使用此功能
int int_key  = type_key<int>();
int bool_key = type_key<bool>();

从类型到某个可索引值的映射后,应该直接创建合适的映射。