问题描述
我想为两种类型的模板专门化,这两种模板都基于相同的基本类型:
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
以上的所有优化级别,任何编译器都会像直接在基础类型上一样对操作进行优化。