接受任何类型的函数作为参数的类C++
C++ class that accepts function of any type as parameter
我正在为一个类编写一个 .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);
}
您会收到错误,因为该类期望模板参数是实际的函数类型,但您将模板参数作为实例化中的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';
}
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;
}
您可以将结构与运算符()一起使用作为建议
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;
}
打印 6
我真的不确定你想要实现什么,因为如果你仍然想把它绑定到具有双精度的参数类型,你怎么能使用任何函数,但是,下面的示例让你的示例模板工作,但我真的看不到用处。
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;
}
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用