我需要实现一个指向成员函数重载的 c++ 函数指针
I need to implement a c++ function pointer to member function overload
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
时,生成所需的结果。请帮帮我,谢谢!!
犰狳文档中arma::sum
的原型如下:
sum( M )
sum( M, dim ) //dim = 0, 1 for rowise or columnwise sum
仅仅因为结果可以分配给某种类型的变量,这并不意味着这是方法的签名。
函数可以返回一个类型,该类型可以转换或分配给其他类型的变量。
在这种情况下,要解决问题 - 必须检查原始函数的签名(在头文件中)。
然后就可以创建正确的签名,特别是如果函数存在重载。
例如,犰狳项目的签名:
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);
}
我只为这种情况保留了一个辅助函数,如果您想在不关心返回类型的情况下解决重载:
template <class... Params, class R>
auto ovl(R(*f)(Params...)) {
return f;
}
然后,您的初始化将变为:
auto Sum = ovl<arma::Mat<double>, int>(arma::sum);
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针