2012-12-11 52 views
5

我需要將距離函數傳遞給模板。因此我使用boost :: function和boost :: bind。但我不明白我必須要通過對類距離將boost :: function傳遞給模板;什麼類是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) {} 
    ... 
} 

的例子由模板的作者是這樣的:

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); 
    ... 
} 

現在,這是我的主:

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); 
    ... 
} 

起初,可以somone解釋我什麼(* const)意味着什麼或者我可以在哪裏讀到這個?
和第二: 我想我寫了你需要的一切,告訴要寫什麼???但我不明白。
我已經嘗試過:

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

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

但這是嘗試和錯誤:)

回答

3

好的開始,能有人爲我解釋一下什麼(* const的)手段或我可以在哪裏讀到這個?

在作者的示例的距離函數是:

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

傳遞給CoverTree構造函數的參數是函數即&euclidean,它的類型的函數的指針的地址

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

CoverTree的模板參數只是該類型的合格版本const。由於在C和C函數的特有的「內向外」聲明語法++,一個const指針,功能類型被聲明爲:

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

這類似於一個const指針int,它被聲明爲:

int* const 

在你的情況,你得到了正確的類型,它是:

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

讓我們用一個typedef來指代:

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

但問題是,你是不是傳遞一個類型的參數,你傳遞一個指針類型:

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

你可以看到這不會做的工作:

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

答案應該是簡單地傳遞正確類型的參數:

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

非常感謝!這編譯!我怎樣才能標記這個解決? –

+0

@ user__42:查找答案左上角附近的複選標記圖標。 – aschepler

相關問題