将函数指针传递给函数,c++

Passing Function Pointers to Functions, c++

本文关键字:函数 c++ 指针      更新时间:2023-10-16

我正试图让一个函数通过指针调用另一个函数,我已经浏览了一些帖子,并尝试过这样做,但我一直收到错误。打印是我想要应用程序调用的函数。Apply应在调用print时打印所有数据。

我得到错误:变量具有不兼容的类型void

      void print(double x) //function I want to pass
{
cout << x << endl;
} 
void apply(vector<double> data, void (*f)(double))
    { //function with pointer to other function print
           for(int i = 0; i< data.sizeof(); i++)
               f(data[i]);
        }

我建议对std::function进行钳制,或者对这样的工作使用和自动:

void apply(const vector<double>& data, std::function<void(double)> f)
{ //function with pointer to other function print
    for(size_t i = 0; i< data.size(); i++)
        f(data[i]);
}

void apply(const vector<double>& data, auto f)
{ //function with pointer to other function print
    for(size_t i = 0; i< data.size(); i++)
        f(data[i]);
}

使用auto将取决于编译器,因为这种用法只有在c++14标准之后才可用。

它应该与下面的整个代码一起工作:

#include <iostream>
#include <vector>
using namespace std;
void print(double x) //function I want to pass
{
    cout << x << endl;
} 
void apply(const vector<double>& data, void (*f)(double))
{ //function with pointer to other function print
    for(size_t i = 0; i< data.size(); i++)
        f(data[i]);
}
void test()
{
    vector<double> data;
    data.push_back(1.0);
    data.push_back(2.0);
    data.push_back(3.0);
    apply(data, print);
}

您想要类似以下内容:

void apply(const vector<double>& data, void (*f)(double) ) {
   for( int i=0; i<data.size(); ++i )
       f(data[i]);
}

我不知道错误是什么。你的代码似乎可以工作(C++11):

#include <iostream>
#include <vector>
using namespace std;
void print(double x) //function I want to pass
{
    cout << x << endl;
}
void apply(const vector<double>& data, void (*f)(double)) { //function with pointer to other function print
    for (size_t i = 0; i < data.size(); i++)
        f(data[i]);
}
int main() {
    vector<double> v{1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9};
    apply(v, print);
    return 0;
}

结果:

1.1
2.2
3.3
4.4
5.5
6.6
7.7
8.8
9.9
RUN FINISHED; exit value 0; real time: 0ms; user: 0ms; system: 0ms

我唯一做的改变是:

  • data.sizeof()更改为data.size(),但我想您已经知道了(vector没有名为sizeof()的公共成员函数)
  • 这不是使其工作所必需的,但却是一种良好的做法:apply的第一个参数(通常)最好声明为const vector<double>& data。也就是说,您传递一个对不会被修改的数据类型/结构的引用(对于预期更高效的内存消耗对象)