【问题标题】:passing a boost::function to a template; what class is boost::function将 boost::function 传递给模板; boost::function 是什么类
【发布时间】:2012-12-11 21:50:22
【问题描述】:

我需要将距离函数传递给模板。因此我使用 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&)

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

【问题讨论】:

    标签: c++ templates boost boost-bind boost-function


    【解决方案1】:

    首先,有人能解释一下 (*const) 是什么意思,或者我可以从哪里读到这方面的信息吗?

    在作者的例子中距离函数是:

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

    传递给CoverTree构造函数的参数是该函数的地址,即&amp;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>&)
    

    这类似于指向intconst 指针,声明为:

    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:寻找答案左上角附近的复选标记图标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多