gpt4 book ai didi

c++ - 通用谓词作为参数的默认值-续

转载 作者:行者123 更新时间:2023-12-02 09:52:32 24 4
gpt4 key购买 nike

我知道已经有Default value on generic predicate as argument了。
但是,也许现在c++ 11,c++ 14或c++ 17有了新的选择?
我如何才能使这项工作不过载?

#include <vector>
#include <numeric>
#include <algorithm>
#include <iterator>
#include <iostream>

#if 0

template <typename CONTAINER, typename PRED>
void print(CONTAINER const & cont, PRED pred = [] (typename CONTAINER::value_type) { return true;})
{
std::copy_if(cont.begin(), cont.end(), std::ostream_iterator<typename CONTAINER::value_type>(std::cout, " "), pred);
std::cout << std::endl;
}

#else

template <typename CONTAINER, typename PRED>
void print(CONTAINER const & cont, PRED pred)
{
std::copy_if(cont.begin(), cont.end(), std::ostream_iterator<typename CONTAINER::value_type>(std::cout, " "), pred);
std::cout << std::endl;
}

template <typename CONTAINER>
void print (CONTAINER const & cont)
{
std::copy(cont.begin(), cont.end(), std::ostream_iterator<typename CONTAINER::value_type>(std::cout, " "));
std::cout << std::endl;
}

#endif

bool
even(
const int& i)
{
return not (i % 2);
}

int
main(
int argc,
char **argv)
{
std::vector<int> myVec(20);
std::iota(myVec.begin(), myVec.end(), 1);

print(myVec);

print(myVec, even);

return 0;
}
启用#if 0部分会导致
../main.cpp:17:6:注意:模板参数推导/替换失败:
../main.cpp:56:13:注意:无法推断出模板参数“PRED”

最佳答案

大概是这样的:

template <typename CONTAINER>
void print(CONTAINER const & cont,
std::function<bool(typename CONTAINER::value_type)> pred =
[] (typename CONTAINER::value_type) { return true;})
{
std::copy_if(cont.begin(), cont.end(),
std::ostream_iterator<typename CONTAINER::value_type>(std::cout, " "),
pred);
std::cout << std::endl;
}
Demo。效率不是特别高,但确实可以满足您的要求。

关于c++ - 通用谓词作为参数的默认值-续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63318769/

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