簡體   English   中英

c ++:將帶有參數的lambda傳遞給函數

[英]c++: Passing lambdas with parameters to functions

我繼續學習C ++,遇到了lambda。 我正在遵循一個簡單的教程,只是為了了解正弦波,但是以下代碼失敗了:

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

void runDivide(double (*divide)(double a, double b)) {
    auto rval = divide(a , b);
    cout << rval << endl;
}

int main() {

  auto funcDiv = [](double value1, double value2) -> double{
      if (value2 == 0.0) {
          return 0;
      }
      return value1 / value2;
  };

  runDivide(funcDiv);

  system("pause");

  return 0;
}

這給我一個“標識符'a'未定義”和“標識符'b'未定義”。 盡管我從教程中復制了它的詳細內容,但也許我遺漏了一些東西?

先謝謝您的幫助!

邁克爾

runDivide()使用變量ab ,但從不聲明它們或給它們賦值。 它們應該是runDivide參數,而不是函數參數聲明的一部分(您無需為這些參數命名,只需聲明類型)。

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

void runDivide(double (*divide)(double, double), double a, double b) {
    auto rval = divide(a , b);
    cout << rval << endl;
}

int main() {

  auto funcDiv = [](double value1, double value2) -> double{
      if (value2 == 0.0) {
          return 0;
      }
      return value1 / value2;
  };

  runDivide(funcDiv, 30.0, 12.3);

  system("pause");

  return 0;
}

您可以在函數指針中命名參數,如下所示:

double (*divide)(double a, double b)

名稱ab是函數指針divide的函數所指向的兩個double的名稱。

但是,此類名稱對C ++ 中的代碼行為沒有影響

double (*divide)(double, double)

這具有完全相同的含義。

divide是一個函數指針,指向一個需要兩個double並返回一個double的函數。

void runDivide(double (*divide)(double, double)) {
  auto rval = divide(a , b);
  cout << rval << endl;
}

這使得ab在這一點上毫無意義。

您需要將double adouble b傳遞給runDivide ,或者在runDivide的范圍內使其可見。

對於函數指針和函數聲明(但對於函數定義或lambda定義而言),此“函數參數名稱無效”是正確的。

要解決此更改

runDivide(funcDiv);

runDivide(funcDiv,1.0, 2.0);

void runDivide(double (*divide)(double, double)) {
  auto rval = divide(a , b);
  cout << rval << endl;
}

void runDivide(double (*divide)(double, double), double a, double b) {
  auto rval = divide(a , b);
  cout << rval << endl;
}

或者,只需在runDivide之前添加全局變量double adouble b並將它們設置為合理的值即可。 我認為這是一個壞主意,因為全局變量是一團糟。

runDivide的唯一參數是divide ab不使用,可以省略。 它們只是傳入函數的參數的占位符。

如果我沒記錯的話,通常無法從一個函數調用另一個函數的參數。 由於只能在特定的函數中訪問它們,因此必須全局聲明這些參數/變量。 接下來,您忘了在代碼的進一步部分中聲明它們。

暫無
暫無

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

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