C ++,模板指向函数的指针

时间:2012-10-05 11:05:45

标签: c++ templates function-pointers

有两个指向不同功能的指针

typedef std::vector<double> TData;
double ( * p_test1 ) ( const TData> &arg);
double ( * p_test2 ) ( const TData> &ar1, char *arg2, char *arg3);

和一个方法,它具有指向函数

的指针作为参数
double f (double ( * p_test1 ) ( const TData  &arg ))
{
    //Long and not trivial algorithm processing results of p_test
    for ( i = 0;... )
    {
       double res = p_test (arg);  //Some computations
    }
}

f()方法包含困难的计算(此处由for循环替换)。

是否可以将此参数模板化(即指向具有不同参数量的函数的指针)以获得处理两种类型参数的通用函数

double f (double ( * p_test1 ) ( const TData  &arg ));
double f (double ( * p_test2 ) ( const TData> &ar1, char *arg2, char *arg3));

或者有没有办法编写这样的函数,例如写一个指向函数指针的指针?

我想避免f()函数的部分特化,因为它的复杂性(重复覆盖长代码效率不高)。

感谢您的帮助......

2 个答案:

答案 0 :(得分:1)

你当然可以写一个模板,至少在C ++ 11中是这样的:

template <typename ...Args>
double f(double(*fp)(Args...))
{
    double res = fp( /* ??? */ );
}

问题是:你怎么知道怎么调用这个函数?

答案 1 :(得分:1)

可以采用任何的方法,作为一种特殊情况,也可以使用函数指针。 E.g。

template<typename Function>
double f (Function p_test)
{ ...
    // if p_test is a function pointer or has operator(), this will work
    double res = p_test (arg);
  ... }

然而问题归结为这两个函数采用不同的参数。因此,参数必须以某种方式捆绑到f,无论如何都需要有几个不同的实现,或者参数总是相同的。

要捆绑参数,通常的方法是使用std::bind(C ++ 11)或boost::bind。假设您有一个需要3个参数(test2)的函数,并且需要将其传递给只提供第一个参数的通用算法(f)。你知道其他的2.所以你这样做:

f(bind(&test2, _1, secondarg, thirdarg))

(在C ++ 11中bindstd::bind_1std::placeholders::_1,在提升bind中为boost::bind且{{1}在标头提供的匿名命名空间中。)在这种情况下,_1需要接受任何参数,因为f的返回类型是未指定的类类型,具有适当的bind