让我们假设我们有一个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()方法,因此可以像传递模板函数一样调用它们。但是,由于您必须使用函数指针,因此没有太多的事情可以做。

09-07 07:37
查看更多