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

5

我需要将一个距离函数传递给一个模板。为此,我使用 boost::function 和 boost::bind。但是我不明白我必须传递什么给 class Distance:

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个回答

3
起初,有人能解释一下(*const)是什么意思或者我在哪里可以读到相关信息吗?
在作者的例子中,distance函数如下:
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++ 中函数声明符号语法的奇特“内外”结构,该函数类型的常量指针声明为:
float (* const)(const std::vector<float>&, const std::vector<float>&)

这类似于一个指向整数的const指针,声明如下:
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);
                                                                    ^^^^^^

非常感谢!这个编译通过了!我该如何将其标记为已解决? - user__42
@user__42:在答案的左上方附近寻找勾选标记图标。 - aschepler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接