簡體   English   中英

無參數函數,類和模板

[英]argumentless function, classes and templates

我正在嘗試使用Romberg方法進行數字積分,該方法由C ++中的數字配方實現。

我的問題是我不知道如何處理多變量函數的1D積分中的常量,即f(x)dx的積分有效,但是我不知道用於計算f(x,y=2,z=5,...)dx

我相信這與類和模板有關,我一點都不熟悉,並且我在玩指針,額外的函數等都沒有成功。

#include <iostream>
#include <math.h>
#include <NR/nr3.h>
#include <NR/interp_1d.h>
#include <NR/quadrature.h>
#include <NR/romberg.h>

double fone (double x)          { return 2*x*x*x;   }
double ftwo (double x, double y){ return 2*x*x*x*y; }

int main()
{
    double Ione = qromb(fone, 1, 3);
    std::cout << Ione << std::endl;

    //double Itwo = qromb(ftwo(x, 2.0), 1, 3);
    //std::cout << Itwo << std::endl;
}

在這里,我將fone(x)x=1集成到3。此代碼有效,但是如果我取消注釋上面的3行,即嘗試將ftwo(x, 2)x=1集成到3,我得到

 invalid initialization of non-const reference of type ‘double&’ from an rvalue 
 of type ‘double’|

似乎我缺乏對C ++中一些基本概念的理解,但我不知道哪個概念,這使得很難用Google搜索這個問題。 這也是我第一次遇到可以不帶參數的函數,即romberg(fone,..)而不是romberg(fone(x),..)而且我不知道該如何調用。

如果有人能指出我需要學習的方向,我將不勝感激。 謝謝!

您可以使用lambda綁定參數:

auto f2 = [](double x) { return ftwo(x, 2.0);};
Itwo = qromb(f2, 1, 3);

根據https://github.com/leonid-pishchulin/humanshape/blob/master/shapemodel/lib/nr/romberg.h ,所述qromb函數被定義為:

template <class T>
Doub qromb(T &func, Doub a, Doub b, const Doub eps=1.0e-10) { /* ... */ }

調用時

double Itwo = qromb(ftwo(x, 2.0), 1, 3);

您將傳遞double類型的右值對象作為第一個參數( ftwo函數調用的結果)。 因此,模板參數T被推斷為是doublefunc參數是一個非const左值參照double 哪個不能綁定到右值參數(這就是錯誤消息所說明的內容。)

您可能想從ftwo生成一元函數,可以按照@ Jarod42的建議使用std::bind或lambda函數來實現。

暫無
暫無

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

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