将boost :: function传递给模板;什么类是boost :: function

时间:2012-12-11 21:50:22

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

模板作者的例子如下:

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

首先,可以向我解释一下(* 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&)

但这是一个很好的尝试和错误:)

1 个答案:

答案 0 :(得分: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的{​​{1}}指针,声明为:

int

在你的情况下,你得到了正确的类型,它是:

int* const

让我们使用typedef来引用它:

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

但问题是您没有传递该类型的参数,而是传递指向该类型的指针:

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