模板如何区分类型?

时间:2017-11-11 22:38:16

标签: c++ templates

编辑澄清这个问题,即使我已经得到了答案: 在2台不同的机器(32位微控制器和32位台式机)上使用GCC(相同版本)2个模板,一个参数 int ,另一个参数 int32_t 看到这些类型,32位大小,一台机器不同,另一台机器相同。 问题是"为什么会这样做"。我得到了一个很好的答案( int32_t 类型是一台机器上的 int 类型的typedef,另一台机器上的类型)。

我有这个模板(占位符)

template<typename T> void PushValue(HSQUIRRELVM vm, T val) {
    DEBUG_ERROR("Dummy PushValue called, type is %s\n", typeid(T).name());
}

这些特殊化应涵盖所有整数类型。

template<> void PushValue<int8_t  >(HSQUIRRELVM vm, int8_t val  );
template<> void PushValue<int16_t >(HSQUIRRELVM vm, int16_t val );
template<> void PushValue<int32_t >(HSQUIRRELVM vm, int32_t val );
template<> void PushValue<int64_t >(HSQUIRRELVM vm, int64_t val );
template<> void PushValue<uint8_t >(HSQUIRRELVM vm, uint8_t val );
template<> void PushValue<uint16_t>(HSQUIRRELVM vm, uint16_t val);
template<> void PushValue<uint32_t>(HSQUIRRELVM vm, uint32_t val);
template<> void PushValue<uint64_t>(HSQUIRRELVM vm, uint64_t val);

我说&#34;应该&#34;因为他们没有抓住&#39; int &#39;和&#39; unsigned int &#39 ;;我不得不加两个。但是,当我添加&#39; &#39;版本,所以&#39; long int &#39;等等,编译器抱怨重复,告诉&#39; long int &#39;例如,与&#39; int32_t &#39;相同。 所以...如果它能够知道 long int int32_t 相同,为什么需要 int int32_t 在我的编译器(32位MIPS处理器,GCC)上应该是相同的,作为不同的类型? 第二个问题:是否有可能抓住所有人。应用于一组类型的模板?

编辑:我在桌面(32位和64位版本)上测试了相同的代码,编译器(也是GCC)将 int int32_t 作为 IDENTICAL 类型,为2个添加的模板变体提供重复功能的错误。所以在桌面上我必须删除2个额外的特化,并且在嵌入式代码上我必须添加它们。

编辑: 在32位微控制器上,GCC:

Sizeof(int)    :4
typeid(int)    :i
Sizeof(int32_t):4
typeid(int32_t):l
Sizeof(long)   :4
typeid(long)   :l

在64位PC上,GCC

sizeof(int)     : 4
typeid(int)     : i
sizeof(int32_t) : 4
typeid(int32_t) : i
sizeof(long)    : 8
typeid(long)    : l

在32位PC上,GCC

sizeof(int)     : 4
typeid(int)     : i
sizeof(int32_t) : 4
typeid(int32_t) : i
sizeof(long)    : 4
typeid(long)    : l

从这里可以看出,GCC采用相同大小的不同类型整数,并且在2个不同的平台上,它为int32_t提供了2种不同的含义(MIPS上的长度,i386上的int)

1 个答案:

答案 0 :(得分:2)

例如,如果shortint都是16位宽,int16_t将是其中一个的同义词,而不是另一个的同义词。如果要覆盖所有整数类型,请使用charshortintlonglong long的签名/无符号变体。不要使用固定大小的typedef。如您所见,它们并未涵盖所有整数类型。