gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:44 27 4
gpt4 key购买 nike

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

我主要关心的是如何正确定义模板参数 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com