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++;不同但仍然相同类型的模板_C++_Templates_Template Specialization_Specialization - Fatal编程技术网

C++ 专门从事C++;不同但仍然相同类型的模板

C++ 专门从事C++;不同但仍然相同类型的模板,c++,templates,template-specialization,specialization,C++,Templates,Template Specialization,Specialization,我想为两种类型专门化一个模板,这两种类型都基于相同的基本类型: using myint=uint16_t; //16 bit integer using myfxpt=uint16_t //8+8 bit fix point number 无法为这两个模板专门化模板,因为它们都是uint16\t。然而,根据代表性,它们仍然不同 如何找到解决此问题的方法?使用某种程度上透明的fixpoint类也可能是一个解决方案,但有效性很重要。我不知道如何编写它,以便在编译器优化后我们得到相同的结果。您需要的

我想为两种类型专门化一个模板,这两种类型都基于相同的基本类型:

using myint=uint16_t; //16 bit integer
using myfxpt=uint16_t //8+8 bit fix point number
无法为这两个模板专门化模板,因为它们都是
uint16\t
。然而,根据代表性,它们仍然不同


如何找到解决此问题的方法?使用某种程度上透明的fixpoint类也可能是一个解决方案,但有效性很重要。我不知道如何编写它,以便在编译器优化后我们得到相同的结果。

您需要的是强typedef。C++没有它们。已经提出了各种增加这些建议的建议,但这些建议提出了一些没有明确决议的问题。目前,伪造它的一种方法是使用枚举类:

enum类myfxpt:uint16_t{};
constexpr myfxpt运算符+(myfxpt lhs、myfxpt rhs)无异常{
返回myfxpt{static_cast(lhs)+static_cast(rhs)};
}
constexpr myfxpt运算符-(myfxpt lhs,myfxpt rhs)无异常{
返回myfxpt{static_cast(lhs)-static_cast(rhs)};
}
//对于您关心的所有操作员也是如此。myint也一样。也许使用宏?

以这种方式编写,对于
-O0
以上的所有优化级别,任何编译器都将优化操作,就像它们直接在底层类型上一样。

您可以使用
struct FixPtStruct{uint16_t fp;}
myint
myfxpt
当前是相同的类型。它们只是同一类型的同名别名。你需要不同的类型。对于
myfxpt
,您可以使用一个具有合适API的结构-一个具有与
unit16
相同的加法运算,但不同的乘法运算以适应其像素点性质的结构。为了可维护性,我希望使用该类型,就好像它是一个基本类型一样。我可以定义一些特性,比如赋值
fxpt=myconst
和其他操作符,但我仍然不知道最终代码的效率有多高。甚至,我只需要加法和减法,所以编译器的内置解决方案就足够了。仅仅处理这些数据就应该有所不同。(例如,显示值)boost有一个强大的typedef,但我仍然不知道最终代码与相同大小的原始类型一样,在启用优化的情况下,效率会有多高。