我需要实现一个指向成员函数重载的c ++函数指针

时间:2018-01-30 05:39:56

标签: c++ pointers armadillo

arma::Mat<double> (*Sum)(arma::Mat<double>, int) = arma::sum; // The function pointer to arma::sum
arma::Mat<double> mat = Sum(A, 1);      //A is of type arma::Mat<double>
std::cout<<mat; 

产生错误:

error: no matches converting function ‘sum’ to type ‘class arma::Mat<double> (*)(class arma::Mat<double>, int)’
arma::Mat<double> (*Sum)(arma::Mat<double>, int) = &arma::sum;

我无法理解为

arma::Mat<T> mat;
mat = arma::sum(this->data, 1);
std::cout<<mat;
当模板T的类型为double时,

会产生所需的结果。请帮助我,谢谢!!

Armadillo文档中arma::sum的原型如下:

sum( M )

sum( M, dim ) //dim = 0, 1 for rowise or columnwise sum

2 个答案:

答案 0 :(得分:1)

仅仅因为结果可以分配给某种类型的变量,这并不代表该方法的签名。

函数可以返回一个可以转换或分配给另一种类型的变量的类型。

在这种情况下,要解决问题 - 必须检查原始函数的签名(在头文件中)。

然后可以创建正确的签名,特别是如果函数有重载。

例如,Armadillo项目的签名:

template<typename T1>
arma_warn_unused
arma_inline
const Op<T1, op_sum>
sum
  (
  const T1& X,
  const uword dim = 0,
  const typename enable_if< is_arma_type<T1>::value       == true  >::result* junk1 = 0,
  const typename enable_if< resolves_to_vector<T1>::value == false >::result* junk2 = 0
  )
  // ignore the implemenation ...

可以看出这个函数返回一个Op类型,它是一个模板类。该函数对于用户参数和2个元编程参数有用2,由实现使用。

如果使用类型arma::Mat<double>调用此函数,则此选定函数的签名为:

const Op<arma::Mat<double>, op_sum> (*sum_func)(const arma::Mat<double>, const uword, const void*, const void*)

正如我在头文件中看到的,提供了sum函数的11个定义。然后元编程也用于提高实现的性能,这也增加了该函数的参数组合量,这意味着更多的定义。

所以这个函数的类型实际上是非常复杂的。而且由于元编程,所以当它被调用时,它并不是一个被使用的元素。

有助于扣除返回类型decltype,可以使用。

class Test
{
public:
    int sum (int i){return 1;}
    float sum (float i){return 2.0;}
};

int main()
{
    Test t;

    decltype(t.sum(0)) (Test::* sum_ptr)(int) = &Test::sum;
    return (t.*sum_ptr)(0);
}

答案 1 :(得分:0)

我为这种情况保留了一个辅助函数,whare你想要解决一个重载而不关心返回类型:

template <class... Params, class R>
auto ovl(R(*f)(Params...)) {
    return f;
}

然后您的初始化变为:

auto Sum = ovl<arma::Mat<double>, int>(arma::sum);