有两个指向不同功能的指针
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()函数的部分特化,因为它的复杂性(重复覆盖长代码效率不高)。
感谢您的帮助......
答案 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中bind
为std::bind
而_1
为std::placeholders::_1
,在提升bind
中为boost::bind
且{{1}在标头提供的匿名命名空间中。)在这种情况下,_1
需要接受任何参数,因为f
的返回类型是未指定的类类型,具有适当的bind
。