将 3 个函子合并为 1 个

发布于 2024-11-30 01:34:08 字数 455 浏览 2 评论 0原文

我有 3 个函子,想知道是否可以将它们组合成 1 个,也许作为模板。 是否可以?如果是这样,我会怎么做。谢谢!

    struct less_than
    {
    bool operator()(double prev,double curr) const
    {
    return prev<curr;
    }
    };

    struct great_than
    {
    bool operator()(double prev,double curr) const
    {
    return prev>curr;
    }
    };

    struct equal_to
    {
    bool operator()(double prev, double curr) const
    {
    return prev==curr;
    }
    };

I have 3 functors and was wondering if these can be combined into 1, perhaps as a template.
is it possible? if so, how would I do it. thx!

    struct less_than
    {
    bool operator()(double prev,double curr) const
    {
    return prev<curr;
    }
    };

    struct great_than
    {
    bool operator()(double prev,double curr) const
    {
    return prev>curr;
    }
    };

    struct equal_to
    {
    bool operator()(double prev, double curr) const
    {
    return prev==curr;
    }
    };

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

可爱暴击 2024-12-07 01:34:09

如果您的意思是由运营商专门化,那么答案是,不,不是在语言级别

幸运的是,STL 已经为此提供了函子(std::equal_to 等)。您可以直接使用它们,也可以将它们用作您自己的函数类的参数。

If you mean, specialized by the operator, then the answer is, no, not at the language level.

Luckily, the STL already provides functors for this (std::equal_to, etc.). You can either use these directly, or use them as arguments to your own function classes.

人间不值得 2024-12-07 01:34:09

由于这些都存在于标准库中,因此您可以执行

template<class F>
struct compare
{
    compare(F _f)
        : f(_f) {};
    bool operator()(double prev, double curr) const
    {
        return f(prev, curr);
    }
    F f;
};

并使用例如 compare<; std::less<双>; >。但这毫无用处,因为您可以直接使用标准库函子。

As these are all existent in the standard library, you can just do

template<class F>
struct compare
{
    compare(F _f)
        : f(_f) {};
    bool operator()(double prev, double curr) const
    {
        return f(prev, curr);
    }
    F f;
};

And use e.g. compare< std::less<double> >. But this would be quite useless, as you can just use the standard library functors directly.

别低头,皇冠会掉 2024-12-07 01:34:09

你可以做这样的事情:

class Functors
{
private:
bool f1(double, double)
{
}

bool f2(double, double)
{
}
bool f3(double, double)
{
}
public:
bool test(int op, double a, double b)
{
//better use function selector, this is only simple example
 if (op == 1)
  return f1(a, b);
 if (op == 2)
  return f2(a, b);
 if (op == 3)
  return f3(a, b);
}
};

使用它:

vector<double> v;
int op = select_op();
//sort vector
std::sort(v.begin(), v.end(), boost::bind(&Functors::test, Functors(), op, _1, _2));

You can do something like this:

class Functors
{
private:
bool f1(double, double)
{
}

bool f2(double, double)
{
}
bool f3(double, double)
{
}
public:
bool test(int op, double a, double b)
{
//better use function selector, this is only simple example
 if (op == 1)
  return f1(a, b);
 if (op == 2)
  return f2(a, b);
 if (op == 3)
  return f3(a, b);
}
};

use it:

vector<double> v;
int op = select_op();
//sort vector
std::sort(v.begin(), v.end(), boost::bind(&Functors::test, Functors(), op, _1, _2));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文