2010-08-13 6 views
2

я, простой структурой C++ следующим образом:В чем смысл этой структуры C++?

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

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

+0

Извините, я прошу прощения за это – ladyfafa

+0

Спасибо за редактирование :) – ladyfafa

+2

Обратите внимание, что в C++ 'struct' - это просто' class' со стандартным доступом, являющимся 'public'. Вопрос не является специфическим для 'struct', и ответы не являются. –

ответ

0

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

10

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

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

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

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

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

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

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

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

@GMan: Спасибо – ladyfafa

+0

@Gman: +1, Хороший ответ. –

+1

И если объекты 'peak2' не очень малы, аргументы также должны быть ссылками на const. –

0

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

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

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

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

, что вызывающий элемент перегрузки вызван.

+0

, который был очень подробным для новичка, действительно помог! :) – ladyfafa

0
#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

@BT: спасибо! ~~~ – ladyfafa

0

$ 13.5.4 состояния -

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

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

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

Смежные вопросы