Какой тип возвращаемого значения boost :: bind?

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

#include <boost/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>

class X 
{       
    int n; 
public: 
    X(int i):n(i){}
    int GetN(){return n;}  
};

int main()
{
    using namespace std;
    using namespace boost;

    X arr[] = {X(13),X(-13),X(42),X(13),X(-42)};
    vector<X> vec(arr,arr+sizeof(arr)/sizeof(X));

    _bi::bind_t<int, _mfi::mf0<int, X>, _bi::list1<arg<1> > > bindGetN = bind(&X::GetN,_1);

    cout << "With  n =13 : " 
         << count_if(vec.begin(),vec.end(),bindGetN == 13)
         << "\nWith |n|=13 : " 
         << count_if(vec.begin(),vec.end(),bindGetN == 13 || bindGetN == -13)
         << "\nWith |n|=42 : " 
         << count_if(vec.begin(),vec.end(),bindGetN == 42 || bindGetN == -42) 
         << "\n";

    return 0;                                                                    
} 

Меня беспокоит то, чтоконечно, строка:

bi::bind_t<int, _mfi::mf0<int, X>, _bi::list1<arg<1> > > bindGetN = bind(&X::GetN,_1);

Я получил тип просто намеренно допустив ошибку типа и проанализировав сообщение об ошибке. Это, конечно, не лучший путь. Есть ли способ получить тип для "bindGetN"? Или, может быть, есть разные способы создания схожей функциональности?

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

25
задан Kostya 20 June 2011 в 13:54
поделиться