【发布时间】:2020-08-08 18:12:26
【问题描述】:
我知道已经有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’
【问题讨论】:
-
我不知道如何避免过载,但你可以让单参数
print调用双参数print,从而避免重复逻辑。 -
这是一个选项。但我正在为谓词寻找一个基本/通用类型来做 w/o 模板参数。