我知道已经有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/