Что означает эта структура C ++? - PullRequest
2 голосов
/ 13 августа 2010

Я получил простую структуру C ++ следующим образом:

// Functor for peak to decreasing intensity sorting
struct cmp_decr_int2
{
    bool operator() (peak2 a, peak2 b) 
    { 
        return a.int2 > b.int2;
    }   
};

есть ли перегрузка оператора в этом примере?

Ответы [ 5 ]

10 голосов
/ 13 августа 2010

Да.operator() называется оператором "вызова функции" и позволяет использовать объект, как если бы он был функцией.Такой класс называется «функтором».

Распространенным шаблоном является создание функторов, которые сравнивают две вещи для равенства или отношений, для использования во всем, что требует предиката сравнения.(Этот можно использовать в std::map, например. Он будет иметь член типа cmp_decr_int2 compare;, а затем он может сравнить отношение между двумя вещами с: if (compare(x, y)) /* x is less than y, by some metric */)

Этот конкретный заказ структурыдва peak2, сравнивая их int2 членов.Лучше было бы написать так:

struct cmp_decr_int2
{
    //                     note const! vvvvv
    bool operator() (peak2 a, peak2 b) const
    { 
        return a.int2 > b.int2;
    }   
};

Функция должна быть const, потому что не нужно менять какие-либо элементы (нет ни одного, чтобы изменить.) const -корректность важно. *

Во многих случаях эти функторы используются в тех случаях, когда сами аргументы равны const, поэтому вы должны принимать аргументы по значению, как в примере, или по константе.

Вы должны предпочитать передавать типы по const-reference, а не по by-value, кроме случаев, когда этот тип является фундаментальным (float, unsigned int, double и т. Д.) Или меньше, чем void*.В большинстве случаев вы будете передавать по const-reference:

struct cmp_decr_int2
{
    // note const&:  vvvvv       v    vvvvv       v    vvvvv
    bool operator() (const peak2 & a, const peak2 & b) const
    { 
        return a.int2 > b.int2;
    }   
};

* Если бы это использовалось в качестве предиката в std::map, например, без const, карта не будетне может сравнивать две вещи, находясь в пределах функции const.

0 голосов
/ 13 августа 2010

$ 13.5.4 штатов-

operator () должен быть нестатической функцией-членом с произвольным числом параметров. Может иметь аргументы по умолчанию. Он реализует синтаксис вызова функции postfix-expression (expression-listopt), где postfix-expression оценивается как объект класса, а возможно пустой список выражений соответствует списку параметров функции-члена operator () класса. Таким образом, вызов x (arg1, ...) интерпретируется как x.operator () (arg1, ...) для объекта класса x типа T, если существует T :: operator () (T1, T2, T3) и если оператор выбран в качестве функции наилучшего соответствия с помощью механизма разрешения перегрузки (13.3.3).

Следовательно, структура 'cmp_decr_int2' определенно перегружена оператором ().

Обратите внимание, что это также единственный оператор в C ++, который может принимать переменное число аргументов.

0 голосов
/ 13 августа 2010
#include <iostream>
using namespace std;

struct cmp_decr_int2
{
    bool operator() (int a, int b)
    { 
        return a > b;
    }

    bool operator() (int i)
    {
        return i > 0;
    }
};

int main()
{
    cmp_decr_int2 a;
    cout << a(1, 2) << endl;
    cout << a(1) << endl;
}

Да, конечно, может перегрузить функцию!Это отлично сработало для меня.

0 голосов
/ 13 августа 2010

в c ++ структура во всех отношениях похожа на класс, за исключением того, что доступ к параметрам по умолчанию - public:, а не private:.Обычной практикой является использование struct вместо класса, когда область использования определенного типа очень узка, как, например, в примере с простым функтором.

В этом примере эмулируется появление указателя на функцию без хрупкости, которая может быть нулевой.

Член operator() здесь перегружает вызов функции.когда вы пытаетесь сделать что-то вроде:

cmp_decr_int2 foo;
foo(peek2(), peek2());

, этот элемент перегрузки вызывается.

0 голосов
/ 13 августа 2010

Структуры в C ++ - это просто классы с открытым по умолчанию средством доступа public вместо private.Так что да, это будет иметь перегрузку функции.

...