C ++ класс, который принимает функцию любого типа в качестве параметра

Я пишу файл .hpp для класса, который должен получить функцию в качестве одного из параметров и сохранить ее в переменной-члене, поэтому мой код выглядит так:

template<typename Function> class myClass
{
public:
myClass(Function function) : pvFunction( function ) {}

//Functor operator
double operator() (double x) const{
return pvFunction(x+4);
}
private:
Function pvFunction
}

Программа выглядит бессмысленной, потому что возвращаемые ей значения пока не важны. Я просто пытаюсь понять, как передать функцию в этот класс и использовать ее оператор функтора. Единственные проблемы:

1) Я не знаю, является ли это определение класса правильным, то есть это правильный способ принятия любого типа функции, передаваемой в качестве параметра объекту этого класса.

2) как мне создать экземпляр этого класса в моей программе? как передать функцию новому объекту, а затем вызвать ее?

Занимался этим довольно долгое время и не могу понять,

РЕДАКТИРОВАТЬ:

в моем программном файле main.cpp этот код получает ошибку:

double function(double);

int main()
{
myClass<double> myClassObject((function));
return 0;
}

double function(double x)
{
return (x+3.0);
}

1

Решение

1) Да, это так.

2) Тип myClassObject из вашего примера должно быть

 myClass<double(*)(double)> myClassObject(function);

так как функция имеет тип double(*)(double), Лучший способ создать объекты такого шаблона — использовать шаблон функции, подобный следующему:

template<typename Function>
myClass<Function> MakeMyClass(Function f)
{
return myClass<Function>(f);
}int main()
{
auto withFuncPtr= MakeMyClass(function);
auto withLambda= MakeMyClass([] (double v) {return v*2;});

Foo foo;
auto withStdFunction = MakeMyClass(
std::bind(&Foo::Method, &foo, std::placeholders::_1));
return 0;
}
1

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

Вы получаете ошибку, потому что класс ожидает, что параметр шаблона будет фактическим типом функции, но вы передаете параметр шаблона как double в экземпляре.

Подумайте об использовании новой функциональности C ++ 11, как std::function.

template<typename T>
struct myClass
{
typedef std::function<T(T)> func_type;

func_type pvFunction;

myClass(func_type func) : pvFunction(func) {}

T operator()(T x)
{ return pvFunction(x + 4); }
};

double function(double x)
{
return (x+3.0);
}

int main()
{
myClass<double> my_class(function);
std::cout << "my_class(3) = " << my_class(3) << '\n';
}
4

Вы можете использовать struct с operator () в качестве предложения

template<typename Function> class myClass
{
public:
myClass(){}

//Functor operator
double operator() (double x) const
{
return pvFunction(x+4);
}
private:
Function pvFunction;
};

struct Double
{
double operator()(const double n)const
{
return n;
}
};

int main() {
myClass<Double> myClassObject;
std::cout<<myClassObject(2.0f);
return 0;
}

Prints 6

0

Я действительно не уверен, чего вы хотите достичь, поскольку как вы можете использовать любую функцию, если вы все еще хотите привязать ее к типу аргумента double, но приведенный ниже пример заставляет ваш пример шаблона работать, но я действительно не не вижу смысла.

    template<typename Function> class myClass
{
public:
myClass(Function function) : pvFunction( function ) {}

//Functor operator
double operator() (double x) const{
return pvFunction(x+4);
}
private:
Function pvFunction;
};

double foo1(double x)
{
return x;
}

double foo2(double x)
{
return x + 1;
}
int main(int argc, char** argv)
{
myClass<double(*)(double)> instance1(foo1);
myClass<double(*)(double)> instance2(foo2);
double a = instance1(1.5), b = instance2(1.5);
return 0;
}
0
По вопросам рекламы [email protected]