2011-12-17 4 views
0
объект

функции, это мой первый раз, когда я видел их, и только что нашел пример о нем и как это работаunary_function и функциональный объект

//function object example 
#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 
//simple function object that prints the passed argument 
class PrintSomething 
{ 
public: 
void operator() (int elem) const 
{ 
cout<<elem<<' '; 
} 
} 
; 
int main() 
{ 
vector<int> vec; 
//insert elements from 1 to 10 
for(int i=1; i<=10; ++i) 
vec.push_back(i); 
//print all elements 
for_each (vec.begin(), vec.end(), //range 
PrintSomething()); //operation 
cout<<endl; 
} 

выход: 0 1 2 3 4 5 6 7 8 9

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

и Нечаянно я нашел unary_function и я нашел пример о нем (unary_function) и примеры выглядят же матч:

// unary_function example 
#include <iostream> 
#include <functional> 
using namespace std; 

struct IsOdd : public unary_function<int,bool> { 
    bool operator() (int number) {return (number%2==1);} 
}; 

int main() { 
    IsOdd IsOdd_object; 
    IsOdd::argument_type input; 
    IsOdd::result_type result; 

    cout << "Please enter a number: "; 
    cin >> input; 

    result = IsOdd_object (input); 

    cout << "Number " << input << " is " << (result?"odd":"even") << ".\n"; 

    return 0; 
} 

outputs : 
Please enter a number: 2 
Number 2 is even. 

является это означает, что unary_function является шаблон объект функции с число конкретных аргументов? и я могу определить свой собственный объект функции или просто использовать unary_function в моих классах.

и спасибо!

+0

Если вам нравятся функциональные объекты, вам, вероятно, понравится [boost :: function] (http://www.boost.org/doc/libs/1_48_0/doc/html/function.html) еще больше. – Lalaland

ответ

0

На самом деле, unary_function не является даже функциональным объектом, так как он не имеет объявленного оператора(). Он предоставляется только для упрощения typedefs аргументов и типов результатов. Я не думаю, что вам это нужно в вашей программе.

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

1

unary_function является вспомогательным шаблоном, который служит только для раскрытия информации о типе вызываемого класса. Это используется некоторыми функциональными конструкциями pre-C++ 11, такими как связывание и компоновка - вы можете связывать и компоновать соответствующие типы, которые определяются с помощью типов typedefs базового класса и binary_function.

В C++ 11 это устареть, так как VARIADIC шаблоны обеспечивают более общий, универсальный подход, и с новым std::function и std::bind вы можете сделать все, что можно сделать до C++ 11 с этими громоздкими конструкциями и многое, многое, многое другое.

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