专为不同但仍相同类型的C ++模板

问题描述

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

using myint=uint16_t; //16 bit integer
using myfxpt=uint16_t //8+8 bit fix point number

由于这两个模板均为uint16_t,因此无法同时为其专门设计模板。但是,根据表示,它们仍然不同。

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

解决方法

您想要的是强类型定义。 C ++没有它们。已经提出了各种添加它们的建议,但是它们提出了尚无明确解决方案的问题。目前,伪造它的一种方法是使用枚举类:

enum class myfxpt : uint16_t {};

constexpr myfxpt operator+(myfxpt lhs,myfxpt rhs) noexcept {
    return myfxpt{static_cast<uint16_t>(lhs) + static_cast<uint16_t>(rhs)};
}
constexpr myfxpt operator-(myfxpt lhs,myfxpt rhs) noexcept {
    return myfxpt{static_cast<uint16_t>(lhs) - static_cast<uint16_t>(rhs)};
}
// Same for all the operators you care about. Same for myint. Maybe use macros?

这样写,对于-O0以上的所有优化级别,任何编译器都会像直接在基础类型上一样对操作进行优化。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...