将模板参数安全地转换为long

时间:2014-04-08 17:44:27

标签: c++ mfc

我有一个传统的MFC应用程序似乎以几种错误的方式使用转换为HashKey ......

有以下模板方法:

template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
    // (algorithm copied from STL hash in xfunctional)
    ldiv_t HashVal = ldiv((long)(ARG_KEY)key, 127773);
    HashVal.rem = 16807 * HashVal.rem - 2836 * HashVal.quot;
    if (HashVal.rem < 0)
        HashVal.rem += 2147483647;
    return ((UINT)HashVal.rem);
}

它给我一个错误:

ldiv_t HashVal = ldiv((long)(ARG_KEY)key, 127773);

一个输出说:

error C2440: 'type cast' : cannot convert from 'GUID' to 'long'

如果是静态转换,则错误为cannot convert from 'HMENU' to 'long',这也是一个问题。

有没有办法投出long ??

中的内容

解决方案

感谢@Joachim Pileborg

在浏览了近100万行代码后,程序似乎只使用GUID结构中的第一个变量。

因此,我根据预期重载了模板:

template<>
AFX_INLINE UINT AFXAPI HashKey<GUID>(GUID key)
{
    return key.Data1>>4;
}

2 个答案:

答案 0 :(得分:2)

这是创建专业化所必需的过程:

  1. 调查所有 HashKeyGUID的使用
  2. 检查正在使用或期待的内容
  3. 结论是MFC 6.0中的原始版本使用了GUID structure的第一个元素(非常非常讨厌的转换)。 GUID的第一个元素是long类型,因此投射很好。

    因此,我们创建了以下专业化在项目中,而不是在 MFC 库中:

    template<>
    AFX_INLINE UINT AFXAPI HashKey<GUID>(GUID key)
    {
        return key.Data1>>4;
    }
    

    这是HashKey在项目中的使用方式。

答案 1 :(得分:1)

这是有风险的,但如果必须,你可以尝试:

long key1 = *(long*)(&key);