某种生成循环

时间:2017-11-11 16:26:31

标签: c++ templates

我有这段代码:

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. 除非我的频道不超过8个,否则它将无法正常工作;
  2. 它主要是样板。
  3. C ++中有没有办法在某种循环中重写它?我认为一个反复出现的模板化结构会完成这项工作,但它并不是真的可读。我该怎么办?

1 个答案:

答案 0 :(得分:4)

在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之前,你必须将fold表达式重写为递归。