Обёртка функции C ++ функции с аргументом шаблона - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь создать функцию-обертку, которая принимает функцию с 1 аргументом шаблона и использует ее в другом заголовочном файле.В основном, основная программа вычисляет определенные переменные, которые определяют my_function, которая используется для определения заголовка «crit.h» в CGAL.Вот «sizing_fun.h», который содержит функцию и обертку функции:

template <typename Point_vec>
double my_function(double x, double y, Point_vec list_of_points)
{
  //use list_of_points
  return 4.0+(x*x+y*y);
}

template <typename FT, typename Point_2, typename Point_vec>
class FT_to_point_function_wrapper : public std::binary_function<Point_2, Point_vec, FT>
{
  typedef FT (*Implicit_function)(FT, FT, FT);
  Implicit_function function;
 public:
  FT_to_point_function_wrapper(Implicit_function f) : function(f) {}
  FT operator()(Point_2 p, Point_vec list) const { return function(p.x(), p.y(), std::forward<Point_vec>(list)); } //error line
};

В «crit.h» я использую my_func в качестве обертки функции, определенной выше.pcc - это аргумент Point_2, а my_list - это аргумент Point_vec.

double local_squared_size_bound = my_func(pcc,my_list);

Я получаю сообщения об ошибках:

sizing_fun.h:17: error: cannot convert 'std::vector<CGAL::Point_2<CGAL::Epick>, std::allocator<CGAL::Point_2<CGAL::Epick> > >' to 'double' in argument passing

Так что, похоже, тип Point_vec не передается правильно.

Я понял этот пост: Оболочка вызова функции C ++ с функцией в качестве аргумента шаблона Но я думаю, что она отличается, потому что ее функции не имеют аргумента шаблона.

1 Ответ

0 голосов
/ 27 февраля 2019

typedef FT (*Implicit_function)(FT, FT, FT);

Вы объявили, что функция принимает один и тот же тип для всех 3 параметров, а также возвращает тот же тип.

Должно было быть typedef FT (*Implicit_function)(FT, FT, Point_vec);

Исправьте сигнатуру Implicit_function, и ваша проблема должна исчезнуть.

В случае, если это хотя бы C ++ 11, вы должны также предпочесть std::function указателю сырой функции, чтобы функции илиМожно принимать лямбды с привязками / перехватами.

FT_to_point_function_wrapper::function должен быть объявлен const, так как он устанавливается только списком инициализатора в конструкторе.При использовании C ++ 11 вы также можете объявить FT_to_point_function_wrapper::FT_to_point_function_wrapper равным constexpr.

FT_to_point_function_wrapper::operator() также следует объявить равным const.

...