5

テンプレートに距離関数を渡す必要があります。したがって、boost::function と boost::bind を使用します。しかし、クラス 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) が何を意味するのか、またはこれについてどこで読めるのか説明してもらえますか?
そして2番目:何を書くべきかを伝えるために、必要なものはすべて書いたと思います??? しかし、私はそれを取得しません。
私はすでに試しました:

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&)

しかし、これは素晴らしい試行錯誤でした:)

4

1 に答える 1

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);
                                                                    ^^^^^^
于 2012-12-11T21:58:41.263 に答える