Mam klasę szablonu, która przechowuje tablicę liczb i chcę zastosować istniejące (skalarne) funkcje do każdego elementu. Na przykład, jeśli przyjmiemy, że moja klasa to std :: vector, to chcę mieć możliwość wywoływania (na przykład) funkcji std :: cos na wszystkich elementach.Jak zastosować funkcję do wszystkich elementów w tablicy (w klasie szablonu C++)
Może rozmowa będzie wyglądać następująco:
std::vector<float> A(3, 0.1f);
std::vector<float> B = vector_function(std::cos, A);
nb Muszę również obsługiwać std :: complex <> types (dla których wywoływana jest odpowiednia funkcja std :: cos).
znalazłem this answer który radzi typ funkcji jako parametr szablonu:
template<typename T, typename F>
std::vector<T> vector_function(F func, std::vector<T> x)
Jednak nie mogę uzyskać to do pracy w ogóle (może dlatego, że funkcje takie jak std :: grzechu i std : cos są zarówno szablonowe, jak i przeciążone?).
Próbowałem również używać std::transform
, ale szybko stał się bardzo brzydki. Dla non-typów złożonych, udało mi się go uruchomić za pomocą 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);
jednak próbuje tej samej sztuczki z std :: kompleks <> typów spowodował zawieszenie run-time.
Czy istnieje dobry sposób, aby to zadziałało? Utknąłem na tym od wieków.
Jak o po prostu 'std :: for_each'? – PaulMcKenzie
Co do początku "brzydkiego", jeśli używasz C++ 11, 'std :: transform' może być napisany przy użyciu lambda bez' typedef': http://ideone.com/stYywt – PaulMcKenzie
Sprawdziłem 'std :: for_each' i wydaje się po prostu wywoływać funkcję dla każdej wartości ... Nie widzę jak zachować wynik (może "std :: transform" jest lepsze pod tym względem?). Nie korzystałem wcześniej z funkcji lambda. Czy istnieje sposób, aby to ogólne/szablonowe? – Harry