簡體   English   中英

將函數指針傳遞給函數,c ++

[英]Passing Function Pointers to Functions, c++

我試圖獲得一個通過指針調用另一個函數的函數,我已經閱讀了一些文章並試圖做到這一點,但我一直遇到錯誤。 打印是我要應用於調用的功能。 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]);
        }

它應與以下整個代碼一起使用:

#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);
}

我建議鉗住std :: function或use和auto來完成這樣的工作:

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標准之后可用。

您想要類似的東西:

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 也就是說,您傳遞了對不會被修改的數據類型/結構的引用(對於預期會更有效的內存消耗對象)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM