gpt4 book ai didi

c++ - 为 C++11 算法组合多个谓词

转载 作者:行者123 更新时间:2023-11-28 04:31:54 25 4
gpt4 key购买 nike

我在 stackoverflow 上读过类似的问题,例如 this one .我的特定用例似乎有点不同:我不需要一直应用所有谓词,而是需要以不同的方式选择和组合它们(&&,||),等待用户输入:我能想到的最好的例子是 unix find,用户可以在其中:

# find all files on condition:
# size more than 100K, modified 7 days ago, from user group abc
find /path/to/somewhere -type f -size +100K -mtime +7 -group abc

假设我定义了以下谓词:

bool size_equal_to() { ... }
bool size_greater_to() { ... }
bool size_less_than() { ... }
bool type_is_file() { ... }
bool type_is_dir() { ... }
bool mtime_plus() { ... }

将 lambda 函数中的这样一组谓词组合到容器列表(如前面的问题所建议的)是可行的,但代码结构非常困惑。有什么更好的建议吗?

最佳答案

嗯,首先,如果它像 find,你是 IO-bounded,所以你可以只使用标志。无需花哨。

但现在让我们假设您实际上是受计算限制的,并且测试标志很重要:

只需编写一个模板函数,根据模板参数中的标志是否已设置来执行所有操作,然后从变量中的标志映射到模板参数中的标志,如下所示:

class Task {
... Whatever
public:
template <std::size_t N>
void operator()(std::integral_constant<std::size_t, N>) {
if (N & 1) test_0();
if (N & 2) test_1();
if (N & 4) test_2();
...
}
}

my_mux<1<<6>(n, the_task);

当然,你还需要my_mux():

#include <type_traits>
#include <stdexcept>
namespace detail {
template <std::size_t N, class F>
typename std::enable_if<!N>::type my_mux_helper(std::size_t n, F& f) {
n == 0 ? f(std::integral_constant<std::size_t, N>()) : throw std::invalid_argument("n must be smaller than N");
}
template <std::size_t N, class F>
typename std::enable_if<N>::type my_mux_helper(std::size_t n, F& f) {
n == N ? f(std::integral_constant<std::size_t, N>()) : my_mux_helper<N - 1>(n, f);
}
}

template <std::size_t N, class F>
void my_mux(std::size_t n, F f) {
detail::my_mux_helper<N - 1>(n, f);
}

查看online on coliru .

关于c++ - 为 C++11 算法组合多个谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52657135/

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