gpt4 book ai didi

c++ - 如何为序列和关联容器实现通用功能?

转载 作者:行者123 更新时间:2023-12-04 12:12:48 26 4
gpt4 key购买 nike

我正在考虑编写一个既适用于序列又适用于关联容器的函数。这就像

 template<class C, class V = typename C::key_type>
bool has_val(const C& c, const V& v)`
在函数内部,我想
  • 检查C类是否有成员函数const_iterator find(key_type) const对于像 set/map 这样的容器类。
  • 如果它不包含 find(),那么我们使用 std::find()对于序列容器,如 std::vector .

  • 检查的最佳做法是什么( 1 )?
    如果我上面描述的不是最好的,请告知是否有更好的方法?
    (不幸的是,我无法使用宏 FOLLY_create_member_invoker 访问较新的 Folly,但我确实有 FOLLY_CREATE_HAS_MEMBER_FN_TRAITS 。不过,我无法成功通过)

    最佳答案

    使用SFINAE检测是否使用c.find() :

    #include <algorithm>

    template <class C, class V, typename = void>
    constexpr inline bool use_mem_find = false;

    template <class C, class V>
    constexpr inline bool use_mem_find<C, V,
    std::void_t<decltype(std::declval<const C&>().find(std::declval<const V&>()))>> = true;

    template<class C, class V>
    bool has_val(const C& c, const V& v) {
    auto end = std::end(c);
    if constexpr (use_mem_find<C, V>)
    return c.find(v) != end;
    else
    return std::find(std::begin(c), end, v) != end;
    }
    Demo.

    关于c++ - 如何为序列和关联容器实现通用功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69386540/

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