我在Visual Studio中为我的项目激活了静态分析。Core Guidelines检查器说我应该使用gsl::at进行订阅。但我的代码是保存。消除这个警告最干净的方法是什么?我应该禁用它吗?我应该以不同的方式编写代码吗?我应该使用gsl::来引入支票的开销吗?我的代码是:
template <typename T, size_t N>
void increase(T(&data)[N])
{
for (size_t i = 0; i < N; ++i)
data[i] +=1;
}
我自己找到了一个解决方案。因为在编译时大小是已知的,所以可以使用std::array、std::get和std::index_sequence。std::get在索引越界的情况下会导致编译错误。不再需要运行时检查。
template <typename... Ts>
constexpr void noop(Ts...) noexcept {}
template <typename T, size_t N, size_t... I>
constexpr void increase(std::array<T, N>& data, std::index_sequence<I...>) noexcept
{
noop((std::get<I>(data) += 1)...);
}
template <typename T, size_t N>
constexpr void increase(std::array<T, N>& data) noexcept
{
increase(data, std::make_index_sequence<N>{});
}