объединяя 3 функтора в 1 - PullRequest
       6

объединяя 3 функтора в 1

3 голосов
/ 15 августа 2011

У меня есть 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;
    }
    };

Ответы [ 3 ]

0 голосов
/ 15 августа 2011

Вы можете сделать что-то вроде этого:

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));
0 голосов
/ 15 августа 2011

Поскольку все они существуют в стандартной библиотеке, вы можете просто сделать

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<double> >.Но это было бы совершенно бесполезно, поскольку вы можете просто использовать стандартные библиотечные функторы напрямую.

0 голосов
/ 15 августа 2011

Если вы имеете в виду, специализируемый оператором, то ответ: нет, не на уровне языка .

К счастью, STL уже предоставляет функторы для этого (std::equal_to и т. Д.).Вы можете использовать их напрямую или использовать в качестве аргументов для своих собственных классов функций.

...