gpt4 book ai didi

c++ - 某种生成循环

转载 作者:行者123 更新时间:2023-11-27 22:42:42 24 4
gpt4 key购买 nike

我有这段代码:

template<class T, class color_type>
void assign_channels(T* ptr, const color_type& color) {
*(ptr + 0) = get_channel<0>(color);

if constexpr(1 < color_type::size) {
*(ptr + 1) = get_channel<1>(color);
}
if constexpr(2 < color_type::size) {
*(ptr + 2) = get_channel<2>(color);
}
if constexpr(3 < color_type::size) {
*(ptr + 3) = get_channel<3>(color);
}
if constexpr(4 < color_type::size) {
*(ptr + 4) = get_channel<4>(color);
}
if constexpr(5 < color_type::size) {
*(ptr + 5) = get_channel<5>(color);
}
if constexpr(6 < color_type::size) {
*(ptr + 6) = get_channel<6>(color);
}
if constexpr(7 < color_type::size) {
*(ptr + 7) = get_channel<7>(color);
}
}

它有两个明显的缺陷:

  1. 除非我的 channel 不超过 8 个,否则它无法正常工作;
  2. 主要是样板文件。

C++ 有没有办法在某种循环中重写它?我认为重复出现的模板化结构可以完成这项工作,但它并不是真正可读的。我应该怎么办?

最佳答案

在 C++17 中使用折叠表达式和 std::index_sequence

template<class T, class color_type, size_t... Is>
void assign_channels(T* ptr, const color_type& color, std::index_sequence<Is...>) {
((ptr[Is] = get_channel<Is>(color)), ...);
}

template<class T, class color_type>
void assign_channels(T* ptr, const color_type& color) {
assign_channels(ptr, color, std::make_index_sequence<color_type::size>{});
}

在 C++17 之前,您必须将折叠表达式重写为递归。

关于c++ - 某种生成循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47240147/

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