c++ - 将复杂函数变体作为参数传递

标签 c++ templates functor

假设我有以下模板函数:

template <class T>
void apply(const vector<complex<T> >& in, vector<T>& out, T (*f)(complex<T>))
{
    out.resize(in.size());
    for(size_t i = 0; i < in.size(); ++i) out[i] = f(in[i]);
}

你可以看到,我只是想将一个函数应用于一个复杂数据的 vector ,并将结果存储到一个真实数据的 vector 中。我认为这应该适用于整个函数列表:abs、norm、real、imag 等。

我的问题是,我该如何传递函数?

我尝试了 apply(in, out, abs) 的变体,为 abs 提供了不同的模板,但没有成功。我很确定问题源于复杂的所有模板的功能,但我不确定如何正确传递它。感谢您的帮助。

最佳答案

问题是 std::abs (来自 <complex> )采用 std::complex<T>作为常量引用的参数。您的函数指针仅按值表示,这会导致不匹配。下面的代码编译得很好:

#include <vector>
#include <complex>

template <class T>
void apply(const std::vector<std::complex<T> >& in, std::vector<T>& out,
           T (*f)(std::complex<T> const&))
{
    out.resize(in.size());
    for(size_t i = 0; i < in.size(); ++i)
      out[i] = f(in[i]);
}

int main(){
  std::vector<std::complex<float> > vcomp;
  std::vector<float> vf;
  apply(vcomp, vf, &std::abs<float>);
}

Live example on Ideone.

然而,一个更好的主意是简单地将函数类型作为模板参数:

template <class T, class F>
void apply(const std::vector<std::complex<T> >& in, std::vector<T>& out, F f)
{
    out.resize(in.size());
    for(size_t i = 0; i < in.size(); ++i)
      out[i] = f(in[i]);
}

Live example on Ideone.

在任何情况下,如果一个函数被模板化并且重载(我不记得<complex>中的一个副手),您有时可能需要在调用站点使用强制转换来消除歧义。函数,但你永远不知道)。

// taking std::abs as an example. It's not actually templated *and* overloaded
typedef float (*func_ptr)(std::complex<float> const&);
apply(vcomp, vf, (func_ptr)&std::abs<float>);

关于c++ - 将复杂函数变体作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9112866/

相关文章:

php - 在 PHP MVC 应用程序中将数据从 Controller 传递到 View

c++ - 创建具有正确边的无向图

c++ - sscanf 拒绝整数读取中的前导零

c++ - 使用 constexpr 方法在结构内部进行模板参数化

c++ - 创建一个可能返回也可能不返回值的仿函数/lambda 的包装器

c++ - double boost::bind 导致编译时错误

haskell - Haskell中有态射吗?

iPhone:在不修改文件扩展名的情况下在Xcode中编译C++文件

c++ - 使用 GCC 4.2.1 在 C++ 中将 char 输出为十六进制流

c++ - C++ 中是否可以有一个 "generic"模板参数,它可以是非类型模板参数,也可以是类型?