gpt4 book ai didi

C++ 为谓词和值重载 std::count_if()

转载 作者:行者123 更新时间:2023-11-30 05:21:46 27 4
gpt4 key购买 nike

考虑下面的代码,其目的是重载 std::count_if() 以使用容器作为参数而不是像往常一样使用输入和输出迭代器。

// overload for call with predicate
template<typename Cont_T, typename Pred_T>
typename std::iterator_traits<typename Cont_T::iterator>::difference_type
count_if(const Cont_T& c, Pred_T p) {
return std::count_if(c.begin(), c.end(), p);
}

// overload for call with value
template<typename Cont_T, typename T = typename Cont_T::value_type>
typename std::iterator_traits<typename Cont_T::iterator>::difference_type
count_if(const Cont_T& c, const T& val) {
return std::count_if(c.begin(), c.end(), val);
}

int main() {
using namespace std;

vector<int> v{1,2,3};
count_if(v, 2); // ambiguous call

return 0;
}

结果是一个编译器错误,表明调用不明确。

有没有办法让它工作?

最佳答案

如果您使用的是标准容器(value_type1),您可以尝试:

// overload for call with predicate
template<typename Cont_T>
typename std::iterator_traits<typename Cont_T::iterator>::difference_type
count_if(const Cont_T& c, std::function<bool(typename Cont_T::value_type)> p) {
return std::count_if(c.begin(), c.end(), p);
}

// overload for call with value
template<typename Cont_T>
typename std::iterator_traits<typename Cont_T::iterator>::difference_type
count_if(const Cont_T& c, const typename Cont_T::value_type& val) {
return std::count(c.begin(), c.end(), val);
}

通过强制第二个参数的类型(不使其成为模板参数),可以避免歧义。但是,我可能不会那样做,而是会坚持使用标准版本,即 count/count_if

1 如果您不能依赖 Cont_T::value_type,您可以将其替换为更“通用”的 decltype(*c.begin ())) 或类似的东西。

关于C++ 为谓词和值重载 std::count_if(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39954488/

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