2013-08-06 6 views
0

Я столкнулся с этим кодом с помощью оператора(). Я никогда не видел этого раньше (я видел +,>, - < <). Может ли кто-нибудь объяснить, когда он должен использоваться и как его использовать?Использование() при перегрузке оператора

class sortResults 
    { 
    public: 
     bool operator() (Result const & a, Result const & b); 
    }; 
+2

Сортировка Сортировка; Сортировщик (resA, resB); ' – Borgleader

+2

Тип дубликата: [C++-функторы - и их использование] (http://stackoverflow.com/q/356950/420683) – dyp

ответ

5

Это называется функтором (не путать с функтором в функциональных языках программирования).

Он имитирует функцию и может быть использован в качестве таковых функций из стандартной библиотеки:

std::vector<Result> collection; 
// fill with data 

// Sort according to the() operator result 
sortResults sort; 
std::sort(collection.begin(), collection.end(), sort); 

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

struct GreaterThan{ 
    int count; 
    int value; 
    GreaterThan(int val) : value(val), count(0) {} 
    void operator()(int val) { 
     if(val > value) 
      count++; 
    } 
} 

std::vector<int> values; 
// fill fill fill 

GreaterThan gt(4); 
std::for_each(values.begin(), values.end(), gt); 
// gt.count now holds how many values in the values vector are greater than 4 
+3

Этот фрагмент несколько путается, поскольку вы инициализируете' sortResults' с кронштейнами тоже. Лучше определите его перед вызовом 'std :: sort', чтобы сделать точку чистой. – Paranaix

+0

Я изменил его, спасибо. –

1

Это означает, что экземпляр sortResults можно назвать, так же, как функцию, принимающую два Result параметры:

sortResults sr; 
Result r1, r2; 
bool b = sr(r1, r2); 

Такой класс называется «функтор». Большинство стандартных библиотечных алгоритмов имеют перегрузки, которые принимают унарные или двоичные функции, такие как этот.