从动态索引中选择一个constexpr索引

时间:2019-05-25 09:15:36

标签: c++ c++11 c++14 constexpr

我有C ++代码,该代码调用一些采用立即索引值(例如int _mm_extract_epi16 (__m128i a, int imm8))的SSE / AVX函数。问题是,我在编译时不知道索引值,所以我必须进行从intconstexpr int的动态转换:

template <int index>
auto extract(__m128i a) noexcept
{
    static_assert(index < 8, "index must be less than 8");
    return _mm_extract_epi16(a, index);
}

auto extract(const __m128i a, const int index) noexcept
{
    switch (index) {
        case 0:  return extract<0>(a);
        case 1:  return extract<1>(a);
        case 2:  return extract<2>(a);
        case 3:  return extract<3>(a);
        case 4:  return extract<4>(a);
        case 5:  return extract<5>(a);
        case 6:  return extract<6>(a);
        case 7:  return extract<7>(a);
        default: return extract<7>(a);
    }
}

我要将代码库升级到AVX2和AVX-512(因此分别将案例数扩展到16和32),并开始想知道是否有更好的方法?还是至少可以避免大量打字?

1 个答案:

答案 0 :(得分:3)

         date  cit portfolio
1  1990-01-01  1.5         1
2  1990-01-01  3.5         2
3  1990-01-01  5.5         3
4  1990-01-01  7.5         4
5  1990-01-01  9.5         5
6  1990-01-01 11.5         1
7  1990-01-01 13.5         2
8  1990-01-01 15.5         3
9  1990-01-01 17.5         4
10 1990-01-01 19.5         5

或者您也可以在C ++ 17中使用折叠表达式。这将向下编译为same thing作为开关。

但是,我认为在这种情况下,由于您所保存的只是键入内容,因此只需复制和粘贴即可。读写更简单。