gpt4 book ai didi

c++ - 如何组合任意谓词仿函数

转载 作者:行者123 更新时间:2023-11-30 01:24:31 25 4
gpt4 key购买 nike

我在使用可变参数模板时遇到了以下问题。

假设所有的谓词仿函数都是这样的形式,

class Pred1 {
public:
Pred1( Args... ); // The signature Args... can vary class to class.

template <typename T>
bool operator()(T t);
};

鉴于这些仿函数,我想制作一个可变参数模板类,如果每个谓词的所有 operator() 都返回真,则返回真,即,

template <typename... Preds>
class CombinePredAnd {
public:
template <typename T>
bool operator()(T t){
// returns true if all of the Preds( Args... ).operator()(t) returns true;
// Args... should be passed when CombinePredAnd is constructed.
}
};

对我来说,我不知道将参数传递给 Preds 的每个构造函数。你能给我一些提示吗?另外,如果您有更好的设计和相同的功能,请告诉我。

最佳答案

可能是这样的:

#include <tuple>
#include <type_traits>

template <std::size_t N, std::size_t I, typename Tuple>
struct evaluate_all
{
template <typename T>
static bool eval(T const & t, Tuple const & preds)
{
return std::get<I>(preds)(t)
&& evaluate_all<N, I + 1, Tuple>::eval(t, preds);
}
};

template <std::size_t N, typename Tuple>
struct evaluate_all<N, N, Tuple>
{
template <typename T>
static bool eval(T const &, Tuple const &)
{
return true;
}
};

template <typename ...Preds>
struct conjunction
{
private:
typedef std::tuple<Preds...> tuple_type;
tuple_type preds;

public:
conjunction(Preds const &... p) : preds(p...) { }

template <typename T>
bool operator()(T const & t) const
{
return evaluate_all<sizeof...(Preds), 0, tuple_type>::eval(t, preds);
}
};

template <typename ...Preds>
conjunction<typename std::decay<Preds>::type...> make_conjunction(Preds &&... preds)
{
return conjunction<typename std::decay<Preds>::type...>(std::forward<Preds>(preds)...);
}

用法:

auto c = make_conjunction(MyPred(), YourPred(arg1, arg2, arg3));

if (c(10)) { /* ... */ }

示例:

#include <iostream>

typedef int T;

struct Pred1
{
int a;
Pred1(int n) : a(n) { }
bool operator()(int n) const { return n >= a; }
};
struct Pred2
{
int a;
Pred2(int n) : a(n) { }
bool operator()(int n) const { return n <= a; }
};

int main()
{
auto c = make_conjunction(Pred1(1), Pred2(3));

std::cout << "1: " << c(1) << "\n"
<< "5: " << c(4) << "\n";
}

注意:您也可以将此方法的“合取”部分设为参数化,这样您只需插入 std::logical_andstd::logical_or 即可获得合取和析取

关于c++ - 如何组合任意谓词仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13550786/

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