use*_*_42 5 c++ templates boost boost-bind boost-function
我需要将距离函数传递给模板.因此我使用boost :: function和boost :: bind.但我不明白我必须通过课程距离:
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) {}
...
}
Run Code Online (Sandbox Code Playgroud)
模板作者的示例如下所示:
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);
...
}
Run Code Online (Sandbox Code Playgroud)
现在这是我的主要内容:
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);
...
}
Run Code Online (Sandbox Code Playgroud)
首先,我可以解释一下(*const)的含义或者我可以在哪里阅读这个内容吗?
第二:我想我写了你需要的一切,告诉你要写什么?但我不懂.
我已经尝试过:
boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&)
Run Code Online (Sandbox Code Playgroud)
和
float (*const) (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&)
Run Code Online (Sandbox Code Playgroud)
但这是很好的尝试和错误:)
首先,有人可以解释一下 (*const) 是什么意思或者我可以在哪里读到这方面的内容吗?
在作者的例子中,距离函数是:
float euclidean(const std::vector<float>&, const std::vector<float>&);
Run Code Online (Sandbox Code Playgroud)
传递给构造函数的参数CoverTree是该函数的地址 ie &euclidean,它是类型的函数指针
float (*)(const std::vector<float>&, const std::vector<float>&)
Run Code Online (Sandbox Code Playgroud)
的模板参数CoverTree只是const该类型的 -限定版本。由于 C 和 C++ 中函数的特殊“由内而外”声明符语法,指向该函数类型的 const 指针声明为:
float (* const)(const std::vector<float>&, const std::vector<float>&)
Run Code Online (Sandbox Code Playgroud)
这类似于const指向 的指针int,其声明为:
int* const
Run Code Online (Sandbox Code Playgroud)
就你而言,你的类型是正确的,它是:
boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&)
Run Code Online (Sandbox Code Playgroud)
让我们使用 typedef 来引用它:
typedef boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&) distance_func;
Run Code Online (Sandbox Code Playgroud)
但问题是您没有传递该类型的参数,而是传递了指向该类型的指针:
CoverTree<float, vector<Frame>::const_iterator, distance_func> tree(&j_dist);
^^^^^^^
Run Code Online (Sandbox Code Playgroud)
您可以通过执行以下操作来看到这是行不通的:
distance_func f = &j_dist; // ERROR! cannot convert distance_func* to distance_func
Run Code Online (Sandbox Code Playgroud)
答案应该是简单地传递正确类型的参数:
CoverTree<float, vector<Frame>::const_iterator, distance_func> tree(j_dist);
^^^^^^
Run Code Online (Sandbox Code Playgroud)