通过在 C++ 中实现类似“map”函数的 python 问题:调用类成员函数

Posted

技术标签:

【中文标题】通过在 C++ 中实现类似“map”函数的 python 问题:调用类成员函数【英文标题】:Issue by implementing a python like "map" function in C++ : call a class member function 【发布时间】:2020-05-15 21:51:19 【问题描述】:

我有一个函数成员:

double XC::nz(double z)
    return pow(z/zrange_0,2)*exp(-pow(z/zrange_0,1.5));

我想得到等价的但具有矢量形式的,所以我做到了:

vector<double> XC::nz_vec(vector<double> input)

    vector<double> output;
    output.resize(input.size());
    transform(input.begin(), input.end(), output.begin(), nz);
    return output;

但是自从调用nz函数后编译没有通过,尤其是transform(input.begin(), input.end(), output.begin(), nz)

所以,我看到了一个替代方案:

    transform(input.begin(), input.end(), output.begin(), this->*nz);

但编译器仍然报错。

在我的标题中,我放了:

class XC

...

public:    
       double nz(double);
       vector<double> nz_vec(vector<double>);


如何规避这个问题,因为我想在同一个类的另一个方法中做:

int numPoints = 100000;
vector<double> nz_vec_min = nz_vec(linspace(zmin[0], zmin[1], numPoints));
vector<double> nz_vec_max = nz_vec(linspace(zmax[0], zmax[1], numPoints));

使用返回向量的 linspace(如在 Python 中)?

我可以设置编译器标志-std=c++11或更早。

【问题讨论】:

确切的编译器错误信息是什么? 【参考方案1】:

问题在于nz 是一个成员函数,因此需要在其关联对象上调用。最简单的方法是使用捕获 lambda:

std::transform(input.begin(), input.end(), output.begin(), [this] (double d)  return nz (d); );

另外,我建议您通过 const 引用而不是通过值传递 input,因为后者会复制。

Live demo

【讨论】:

以上是关于通过在 C++ 中实现类似“map”函数的 python 问题:调用类成员函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中实现方法返回类似 Java 中的对象 [关闭]

Scala - 如何在 Spark 的 map 函数中实现 Try

PHP中实现函数重载

在 WebAssembly 中实现回调的方式

如何在 C++ 中实现函数超时

在 C++ 中实现 C 库函数