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

标签 c++ predicate

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

相关文章:

java - 在 Java 中将谓词作为 lambda 返回

类中的 C++ std::vector,函数在返回值和大小在 foreach 中增长时崩溃

c++ - 在非联网计算机之间复制 Visual Studio C++ 项目

c++ - std::forward_list::remove_if 谓词的要求

ios - 谓词正则表达式中占位符使用的语法是什么?

oop - 什么是谓词调度

prolog - Prolog 中的复合 boolean 表达式

c++ - Code::Blocks 调试问题

c++ - 在 C++ 中计算单 channel 直方图的均值和标准差

c++ - 协调大组名称时崩溃