我有一个存储数字数组的模板类,我想将现有(标量)函数应用于每个元素.例如,如果我们假设我的类是std :: vector,那么我希望能够在所有元素上调用(例如)std :: cos函数.
也许一个电话看起来像这样:
std::vector<float> A(3, 0.1f);
std::vector<float> B = vector_function(std::cos, A);
Run Code Online (Sandbox Code Playgroud)
注意我还必须处理std :: complex <>类型(为其调用适当的复杂std :: cos函数).
我发现这个答案建议将函数类型作为模板参数:
template<typename T, typename F>
std::vector<T> vector_function(F func, std::vector<T> x)
Run Code Online (Sandbox Code Playgroud)
但是,我根本无法使用它(可能是因为像std :: sin和std :: cos这样的函数都是模板化和重载的?).
我也尝试过使用std::transform,但很快变得非常难看.对于非复杂类型,我设法使用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);
Run Code Online (Sandbox Code Playgroud)
但是,尝试使用std :: complex <>类型的相同技巧会导致运行时崩溃.
有没有一个很好的方法让这个工作?多年来我一直坚持这一点.