gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:49:33 28 4
gpt4 key购买 nike

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 的原型(prototype)如下:

sum( M )

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

最佳答案

仅仅因为结果可以赋值给某个类型的变量,并不意味着,那是方法的签名。

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

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

然后就可以创建正确的签名,特别是在函数重载的情况下。

例如,来自 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 type 是一个模板类。该函数有 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);
}

关于c++ - 我需要实现一个指向成员函数重载的 C++ 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48514584/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com