2012-12-11 26 views
5

Tôi cần phải vượt qua một khoảng cách chức năng cho một mẫu. Vì vậy tôi sử dụng boost :: function và boost :: bind. Nhưng tôi không hiểu những gì tôi phải vượt qua cho lớp cách:chuyển một hàm tăng :: vào mẫu; những gì lớp học được tăng :: chức năng

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

ví dụ bởi tác giả của mẫu trông như thế này:

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

Bây giờ đây là chính tôi:

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

Lúc đầu, ai đó có thể giải thích cho tôi điều gì (* const) có nghĩa là hoặc nơi tôi có thể đọc về điều này?
Và thứ hai: Tôi nghĩ rằng tôi đã viết mọi thứ bạn cần, để nói những gì cần viết cho ??? nhưng tôi không hiểu.
Tôi đã cố gắng:

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&) 

nhưng điều này là thoải mái thử và lỗi :)

Trả lời

3

Lúc đầu, somone có thể giải thích cho tôi những gì (* const) có nghĩa là hoặc nơi tôi có thể đọc về điều này?

Trong ví dụ của tác giả chức năng khoảng cách là:

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

Đối số truyền cho constructor CoverTree là địa chỉ của hàm nghĩa &euclidean, mà là một con trỏ hàm kiểu

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

Thông số mẫu cho CoverTree chỉ đơn giản là phiên bản loại const được chứng nhận.Do sự "từ trong ra ngoài" cú pháp declarator đặc biệt cho các chức năng trong C và C++, một con trỏ const để loại hàm được khai báo là:

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

Điều này giống như một con trỏ const để int, được khai báo là:

int* const 

Trong trường hợp của bạn, bạn có đúng loại, đó là:

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

Hãy sử dụng typedef để ám chỉ rằng:

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

nhưng vấn đề là bạn không phải đi qua một đối số kiểu đó, bạn đang đi qua một con trỏ đến kiểu đó:

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

Bạn có thể thấy điều này sẽ không làm việc bằng cách thực hiện:

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

Câu trả lời sẽ chỉ đơn giản là để vượt qua một cuộc tranh cãi của các loại đúng:

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

Cảm ơn bạn rất nhiều! Điều này biên dịch! Tôi có thể gắn thẻ thẻ này như thế nào? –

+0

@ user__42: Tìm biểu tượng dấu kiểm gần phía trên bên trái của câu trả lời. – aschepler

Các vấn đề liên quan