передача boost :: function в шаблон; какой класс является 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&)

но это была хорошая попытка и ошибка 🙂

5

Решение

Во-первых, может ли кто-нибудь объяснить мне, что означает (* 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 ++ константный указатель на этот тип функции объявляется как:

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);
^^^^^^
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]