Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板如何区分类型?_C++_Templates - Fatal编程技术网

C++ 模板如何区分类型?

C++ 模板如何区分类型?,c++,templates,C++,Templates,编辑以澄清问题,即使我已经得到了答案: 在2台不同的机器(32位微控制器和32位台式PC)上,使用GCC(大致相同的版本)2个模板,一个带有参数int,另一个带有参数int32_t,可以看到这些类型,大小都是32位,在一台机器上不同,在另一台机器上相同。 问题是“它为什么这样做”。我得到了一个很好的答案(一台机器上的int类型是int类型上的typedef,另一台机器上的long类型上的typedef) 我有这个模板(占位符) 在64位PC上,GCC sizeof(int) : 4 ty

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

我有这个模板(占位符)

在64位PC上,GCC

sizeof(int)     : 4
typeid(int)     : i
sizeof(int32_t) : 4
typeid(int32_t) : i
sizeof(long)    : 8
typeid(long)    : l
sizeof(int)     : 4
typeid(int)     : i
sizeof(int32_t) : 4
typeid(int32_t) : i
sizeof(long)    : 4
typeid(long)    : l
在32位PC上,GCC

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

从这里可以看出,GCC将相同大小的不同类型整数视为不同的类型,并且在两个不同的平台上,它为int32_t赋予了两种不同的含义(在MIPS上为long,在i386上为int)

例如,如果
short
int
都是16位宽的,那么
int16_t
将是其中一个的同义词,而不是另一个。如果要涵盖所有整数类型,请使用有符号/无符号变体
char
short
int
long
long
。不要使用固定大小的typedefs。正如您所看到的,它们并不涵盖所有整数类型。

例如,可以捕获所有带符号整数类型的模板。在我的例子中,他们无论如何都必须转换int32\u t类型中的值,它们的内部代码都是相同的。那么为什么长int被视为int32\u t呢?此外,long int不应该是固定类型。请参阅和参考。“我的编译器(32位MIPS处理器,GCC)上的int和int32_t应该是相同的”…对不起,但是32位MIPS处理器和GCC到底意味着int和int32_t是或应该是相同的类型吗?我应该更好地解释自己。。。在我的设置中,int是一个int32\t,或者更好,是一个32位有符号整数。所以,它们的实现是相同的,但GCC认为它们是不同的,这我可以理解。但我不明白的是,例如,为什么需要很长的int和int32_t相同。在某些情况下,一个很长的整数可能很容易成为整数。我想这是我问题的正确答案,至少从我最近的测试中看到的情况来看。通常在微控制器上,我总是使用固定大小的类型,但我看到在模板上,我将用普通类型替换它们。谢谢大家!@Max—请注意,如果您想要定义所有的专门化,那么这就是您所需要的。完成后,您可以使用固定大小的类型调用它们;它们都是内置类型的typedef。
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);