让我们假设我们有一个n个变量的函数
y = f (x1, ..., xn)
我想将这样的函数作为参数传递。
在Matlab中,可以使用手柄进行以下构造:
function y=func(x)
y = sin(x(0)) * cos(x(1)) //Any definition, not important
p_func=@func; //Define handle
可以将句柄用作另一个函数的参数:
y = function2(p_func, n);
其中n代表维度...
如何使用C ++重写此代码?我们使用带有功能模板的简单模型
temmplate <typename T>
T func( const T *arg, const short n) {return sin(arg[0]) * cos(arg[1])};
其中xi自变量由n个元素的一维数组表示。问题在于,在这种情况下,无法使用指向功能模板的指针
template <class T>
static T ( *pfunc ) ( const T *arg, const short n )
仅专业化...也许其他模型可能更合适...感谢您的帮助...
备注:
我知道班级模板很有用
template <typename T>
class Foo
{
T func( const T *args, const short n);
};
这个建筑工程:
template <class T>
static T ( *pfunc ) ( const T *arg, const short n )
但是它可能不会在库的当前模型中使用(我不能影响这一点)。
最佳答案
C ++是一种静态类型的语言。 C ++中的每个对象,无论是函数指针还是其他任何对象,都必须具有特定的类型。并且,函数指针的类型基于给定要指向的函数的参数的类型。
模板不是对象,因此您无法获得指向该对象的指针。您可以获得一个指向模板实例化的指针。使用您的func
定义,func<int>
是一个使用const int*
和short
的函数。您可以获得指向func<int>
的指针。但是func
是模板;您无法获得指向模板的指针。
这就是为什么C ++程序经常抛出函子而不是函数指针的原因。函子可以具有模板operator()
方法,因此可以像传递模板函数一样调用它们。但是,由于您必须使用函数指针,因此没有太多的事情可以做。