2012-12-11 18 views
5

Ho bisogno di passare una funzione di distanza a un modello. Quindi uso boost :: function e boost :: bind. Ma non capisco cosa devo passare per classe Distanza:passando una funzione boost :: a un modello; quale classe è boost :: function

template<class DataType, class Point, class Distance> 
class CoverTree 
{ 
    Distance distance; 
    ... 
    public: 
    CoverTree(const Distance& distance) : max_level(default_max_level), min_level(default_max_level), distance(distance) {} 
    ... 
} 

l'esempio dall'autore del modello si presenta così:

float euclidian(const std::vector<float>& p1, const std::vector<float>& p2) 
{ 
    ... 
} 
int main(int argc, char** argv) 
{ 
    CoverTree<float, std::vector<float>, float (*const)(const std::vector<float>&, const std::vector<float>&)> tree(&euclidian); 
    ... 
} 

Ora, questo è il mio principale:

int main(int argc, char** argv) 
{ 
    AllData myData; 
    boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&)> j_dist; 
    j_dist = boost::bind(&AllData::jaccard_distance, myData, _1, _2); 
    myData.AddData("C:\\..."); 
    cout<<j_dist(myData.DATAx.begin()+20, myData.DATAx.begin()+40)<<endl; //works fine 
    CoverTree<float, vector<Frame>::const_iterator, ???> tree(&j_dist); 
    ... 
} 

In un primo momento, qualcuno può spiegarmi cosa significa (* const) o dove posso leggere su questo?
E secondo: Penso di aver scritto tutto il necessario, di dire cosa scrivere per ??? ma non capisco.
Ho già provato:

boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&) 

e

float (*const) (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&) 

ma questo era bella prova ed errore :)

risposta

3

In un primo momento, può somone me spiegare che cosa (* const) significa o dove posso leggere su questo?

Nell'esempio dell'autore funzione distanza è:

float euclidean(const std::vector<float>&, const std::vector<float>&); 

L'argomento passato al costruttore CoverTree è l'indirizzo di tale funzione cioè &euclidean, che è un puntatore a funzione di tipo

float (*)(const std::vector<float>&, const std::vector<float>&) 

Il parametro di modello per CoverTree è semplicemente una versione qualificata di const -qualified.A causa della particolare sintassi dichiaratore "rovescio" per le funzioni in C e C++, un puntatore const a quel tipo di funzione viene dichiarata come:

float (* const)(const std::vector<float>&, const std::vector<float>&) 

Questo è analogo a un puntatore const a int, che viene dichiarata come:

int* const 

Nel tuo caso, hai il giusto tipo, è:

boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&) 

Usiamo un typedef per riferirsi a che:

typedef boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&) distance_func; 

ma il problema è che non sta passando un argomento di questo tipo, si sta passando un puntatore a quel tipo:

CoverTree<float, vector<Frame>::const_iterator, distance_func> tree(&j_dist); 
                    ^^^^^^^ 

Si può vedere questo non funziona facendo:

distance_func f = &j_dist; // ERROR! cannot convert distance_func* to distance_func 

la risposta dovrebbe essere semplicemente passare un argomento del tipo corretto:

CoverTree<float, vector<Frame>::const_iterator, distance_func> tree(j_dist); 
                    ^^^^^^ 
+0

Grazie mille! Questo compila! Come posso taggare questo come risolto? –

+0

@ utente__42: cerca l'icona del segno di spunta vicino all'angolo superiore sinistro della risposta. – aschepler

Problemi correlati