我正在寻找一种惯用的方法来优化我编写的这个模板。
我主要关心的是如何正确定义模板参数 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/