Tôi có một lớp mẫu lưu trữ một dãy số và tôi muốn áp dụng các hàm hiện có (vô hướng) cho mọi phần tử. Ví dụ, nếu chúng ta giả sử lớp của mình là std :: vector, thì tôi muốn có thể gọi (ví dụ) hàm std :: cos trên tất cả các phần tử.Cách áp dụng hàm cho tất cả các phần tử trong mảng (trong lớp mẫu C++)
Có lẽ một cuộc gọi sẽ trông như thế này:
std::vector<float> A(3, 0.1f);
std::vector<float> B = vector_function(std::cos, A);
N.B. Tôi cũng phải xử lý std :: phức tạp <> loại (trong đó có phức tạp std :: cos chức năng được gọi là).
tôi thấy this answer đó đề nghị dùng các loại chức năng như một mẫu tham số:
template<typename T, typename F>
std::vector<T> vector_function(F func, std::vector<T> x)
Tuy nhiên, tôi không thể có được điều này để làm việc ở tất cả (có lẽ vì các chức năng như std :: tội lỗi và std: : cos là cả hai templated và quá tải?).
Tôi cũng đã thử sử dụng std::transform
, nhưng điều này nhanh chóng trở nên rất xấu. Đối với các loại phi phức tạp, tôi quản lý để làm cho nó làm việc bằng cách sử dụng typedef:
std::vector<float> A(2, -1.23f);
typedef float (*func_ptr)(float);
std::transform(A.begin(), A.end(), A.begin(), (func_ptr) std::abs);
Tuy nhiên, cố gắng lừa tương tự với std :: phức tạp <> loại gây ra một vụ tai nạn thời gian chạy.
Có cách nào tốt đẹp để làm việc này không? Tôi đã bị mắc kẹt về điều này cho các lứa tuổi.
Làm thế nào về chỉ đơn giản là 'std :: for_each'? – PaulMcKenzie
Để bắt đầu "xấu xí", nếu bạn đang sử dụng C++ 11, 'std :: transform' có thể được viết bằng lambda mà không có' typedef': http://ideone.com/stYywt – PaulMcKenzie
Tôi tra cứu 'std :: for_each' và có vẻ như chỉ cần gọi một hàm trên mỗi giá trị ... Tôi không thể thấy làm thế nào để giữ kết quả (có thể 'std :: transform' là thích hợp hơn trong khía cạnh này?). Tôi chưa từng sử dụng hàm lambda trước đây. Có cách nào để làm cho chung/templated? – Harry