【问题标题】:Specialize C++ template for different but still same types为不同但仍然相同的类型专门化 C++ 模板
【发布时间】:2020-08-30 20:54:27
【问题描述】:

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

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

不可能为两者专门化一个模板,因为两者都是uint16_t。但是,根据表示方式,它们还是有区别的。

如何找到解决此问题的方法?使用某种透明的固定点类也可能是一种解决方案,但有效性很重要。不知道怎么写才能让编译器优化后得到同样的结果。

【问题讨论】:

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

标签: c++ templates template-specialization specialization


【解决方案1】:

你想要的是强类型定义。 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 的所有优化级别,任何编译器都会像直接在底层类型上一样优化操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2017-01-17
    • 2017-01-22
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多