c++ - 根据其他参数计算模板参数的惯用方法

标签 c++ c++14

我正在寻找一种惯用的方法来优化我编写的这个模板。

我主要关心的是如何正确定义模板参数 n 并将其用作返回参数,同时用户不得覆盖它。

我也愿意听取有关如何以惯用的 C++14 方式编写此模板的其他建议。

template<
  typename InType=uint32_t,
  typename OutType=float,
  unsigned long bits=8,
  unsigned long n=(sizeof(InType) * 8) / bits
>
std::array<OutType,n> hash_to_color(InType in) noexcept {    
  InType mask = ~0;
  mask = mask << bits;
  mask = ~mask;
  std::array<OutType,n> out;
  auto out_max = static_cast<OutType>((1 << bits) - 1);
  for (auto i = 0; i < n; i++) {
    auto selected = (in >> (i * bits)) & mask;
    out[i] = static_cast<OutType>(selected) / out_max;
  }
  return out;
}

最佳答案

关于 n模板参数,你可以使用 auto 来避免它作为 C++14 中的返回类型。这是该原则的一个更简单的示例:

template<int N>
auto f()
{
    constexpr int bar = N * 3;   
    std::array<int, bar> foo;
    return foo;
}

自然数组模板参数的计算必须是常量表达式。

另一个选项(与 C++11 兼容)是 trailing-return-type:

template<int N>
auto f() -> std::array<int, N * 3>
{

这比利用 C++14 允许从 return 中推导返回类型要冗长一点声明。

备注:~0在你的代码中是错误的,因为 0是一个 int ,应该是~(InType)0 .还有 (1 << bits) - 1有潜在的溢出问题。

关于c++ - 根据其他参数计算模板参数的惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39803700/

相关文章:

c++ - constexpr 值的数据结构

c++ - 这个 for 循环是如何终止的?

c++ - 如何获取面上的点来绘制Delaunay三角剖分

c++ - 泛型 lambda 的实例化

c++ - 按第一个容器的元素对两个容器进行同步排序

c++ - 递归可变参数函数模板的返回类型的decltype

c++ - 是否可以重用通常的迭代器来构建 const 迭代器?

c++ - 创建 Dll 文件

c++ - 是否可以创建一个用户定义的文字,将字符串文字转换为自己类型的数组?

c++ - 如何在C++中加载caffe模型进行预测