我的一个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'
你可以给我一个暗示吗?
感谢。
答案 0 :(得分:3)
假设您想要对标题中的问题给出答案(我无法理解C#代码):在C ++中,您可以使用std::type_index
作为类型的键:您&#39; d使用typeid(x)
将表达式x
的类型作为std::type_info
对象获取,然而,该对象不能轻易用作关键字。但是,您可以为此对象构建std::type_index
,可以将其用作关键字,例如std::map<K, V>
。
还有另一种将类型映射到整数的方法,这种方法也很有效,尽管下面写的T const
和T
形式会得到不同的值(这可以通过在实际之前对类型进行规范化来增强获得整数):
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>();
从类型到某个可索引值的映射后,应该直接创建合适的映射。