2012-12-11 54 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

相关问题