gpt4 book ai didi

c++ - 如何检测 std::integer_sequence 中特定数字的索引?

转载 作者:行者123 更新时间:2023-12-01 14:47:05 27 4
gpt4 key购买 nike

我基本上使用这个问题作为引用起草了编译时主要检查:
Compile time prime checking
我有一个 IsPrime<3>::value 可用。
我想设计一个 find 元函数,它在编译时基本上确定我的整数序列中是否有素数,如果有则返回索引,否则返回 -1;
例子

  • find<std::integer_sequence<4,6,8,3>>::value // 3
  • find<std::integer_sequence<4,6,8,27>>::value // -1
  • find<std::integer_sequence<4,6,8,3,5,27>>::value // 3(as index 3 is the first prime, we do not care about others)

  • 我无法理解参数包,任何好的例子或带有解释的正确解决方案都会有很大帮助。
    像下面这样大声思考,但无法解决我的问题,如何获取索引以及如何在找到序列中的第一个素数后停止迭代
    template<typename T... args>
    struct find_prime{
    static constexpr int value = is_prime<args>::value ? increement++ : is_prime<...>::args;
    };
    对不起,如果这听起来像一个愚蠢的方法,无法弄清楚如何使用索引进行迭代

    最佳答案

    这可以通过递归模板来完成。当找到素数时,递归提前终止。

    // Base failure case: our list is empty (or the specialization below would match)
    template <int, int...>
    struct find_prime_impl {
    static constexpr int value = -1;
    };

    // Specialization for at least one item remaining. If it's prime, the current
    // index is assigned to value; otherwise we recurse with an incremented index,
    // and without the first item.
    template <int Index, int Head, int... Tail>
    struct find_prime_impl<Index, Head, Tail...> {
    static constexpr int value = [] {
    if constexpr (is_prime<Head>::value) {
    return Index;
    } else {
    return find_prime_impl<Index + 1, Tail...>::value;
    }
    }();
    };

    // Calls the recursive template with the initial index 0.
    template <int... Values>
    struct find_prime : find_prime_impl<0, Values...> {};
    立即调用的 lambda 使我们可以使用 if constexpr这意味着编译器可以跳过实例化 find_prime_impl 的递归使用。当满足终止条件时。三元运算符不会以这种方式“短路”实例化,并且仍然会一直实例化整个递归链直至 find_prime_impl<Index> .
    ( Demo )

    直接使用 std::integer_sequence ,调整实现以期望它:
    // Failure case when the type isn't std::integer_sequence
    template <int, typename>
    struct find_prime_impl {};

    // Failure case when our list is empty (or the specialization below would match)
    template <typename TInt, int Index>
    struct find_prime_impl<Index, std::integer_sequence<TInt>> {
    static constexpr int value = -1;
    };

    // Specialization for at least one item remaining. If it's prime, the current
    // index is assigned to value; otherwise we recurse with an incremented index,
    // and without the first item.
    template <typename TInt, int Index, TInt Head, TInt... Tail>
    struct find_prime_impl<Index, std::integer_sequence<TInt, Head, Tail...>> {
    static constexpr int value = [] {
    if constexpr (is_prime<Head>::value) {
    return Index;
    } else {
    return find_prime_impl<
    Index + 1,
    std::integer_sequence<TInt, Tail...>
    >::value;
    }
    }();
    };

    // Calls the recursive template with the initial index 0.
    template <typename T>
    struct find_prime : find_prime_impl<0, T> {};

    关于c++ - 如何检测 std::integer_sequence 中特定数字的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63343831/

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