trình duyệt thời gian dài, người hỏi lần đầu tại đây. Tôi đã viết một số script để thực hiện các phương thức tích hợp số 1D khác nhau và biên dịch chúng thành một thư viện. Tôi muốn thư viện đó linh hoạt nhất có thể về những gì nó có khả năng tích hợp.C++: chức năng chuyển với số tham số tùy ý dưới dạng tham số
Ở đây tôi bao gồm một ví dụ: một ví dụ quy tắc hình thang rất đơn giản, nơi tôi chuyển con trỏ đến hàm được tích hợp.
// Numerically integrate (*f) from a to b
// using the trapezoidal rule.
double trap(double (*f)(double), double a, double b) {
int N = 10000;
double step = (b-a)/N;
double s = 0;
for (int i=0; i<=N; i++) {
double xi = a + i*step;
if (i == 0 || i == N) { s += (*f)(xi); }
else { s += 2*(*f)(xi); }
}
s *= (b-a)/(2*N);
return s;
}
Điều này rất hữu ích cho các chức năng đơn giản chỉ thực hiện một đối số. Ví dụ:
double a = trap(sin,0,1);
Tuy nhiên, đôi khi tôi có thể muốn tích hợp thứ gì đó có nhiều tham số hơn, như đa thức bậc hai. Trong ví dụ này, các hệ số sẽ được xác định bởi người dùng trước khi tích hợp. mã ví dụ:
// arbitrary quadratic polynomial
double quad(double A, double B, double C, double x) {
return (A*pow(x,2) + B*x + C);
}
Lý tưởng nhất, tôi sẽ có thể làm điều gì đó như thế này để tích hợp nó:
double b = trap(quad(1,2,3),0,1);
Nhưng rõ ràng đó không làm việc. Tôi đã nhận được xung quanh vấn đề này bằng cách định nghĩa một lớp học có các hệ số như các thành viên và các chức năng hấp dẫn như một hàm thành viên:
class Model {
double A,B,C;
public:
Model() { A = 0; B = 0; C = 0; }
Model(double x, double y, double z) { A = x; B = y; C = z; }
double func(double x) { return (A*pow(x,2)+B*x+C); }
};
Tuy nhiên, sau đó chức năng hội nhập của tôi cần phải thay đổi để có một đối tượng như là đầu vào thay vì con trỏ hàm:
// Numerically integrate model.func from a to b
// using the trapezoidal rule.
double trap(Model poly, double a, double b) {
int N = 10000;
double step = (b-a)/N;
double s = 0;
for (int i=0; i<=N; i++) {
double xi = a + i*step;
if (i == 0 || i == N) { s += poly.func(xi); }
else { s += 2*poly.func(xi); }
}
s *= (b-a)/(2*N);
return s;
}
Điều này hoạt động tốt, nhưng thư viện kết quả không được xác định vì cần mô hình lớp ở đâu đó. Ngoài ra, lý tưởng là Mô hình sẽ có thể thay đổi từ người dùng sang người dùng vì vậy tôi sẽ không muốn sửa nó trong một tệp tiêu đề. Tôi đã cố gắng sử dụng các mẫu hàm và functors để làm việc này nhưng nó không phải là rất độc lập kể từ lần nữa, mẫu nên được định nghĩa trong một tệp tiêu đề (trừ khi bạn muốn khởi tạo một cách rõ ràng, mà tôi không làm). Vì vậy, để tổng hợp: có cách nào tôi có thể nhận các chức năng tích hợp để chấp nhận các hàm 1D tùy ý với số tham số đầu vào trong khi vẫn còn độc lập đủ để chúng có thể được biên dịch thành một thư viện độc lập không? Không. Cảm ơn trước cho các đề xuất.
['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind) –