如何将处理不同数字类型的C函数库包装到c++模板类中

How to wrap a C function library that works with different numeric types into a C++ template class

本文关键字:包装 c++ 函数 处理 类型 数字      更新时间:2023-10-16

我想使用C库中的代码(我的具体示例:FFTW)来实现一个c++类模板。C库定义了一些数据类型和函数,它们做同样的事情,但对不同类型的基本数字类型,例如fftw_complex(双精度对象对)和fftwf_complex(浮点数对);Fftw_execute()和fftwf_execute(),等等

我想实现一个只依赖于这个基本类型的类模板,例如

FFT, FFT<;等。

在这个例子中,库遵循了所有函数和数据都有相同的前缀来指定它们使用的数据类型的约定,所以我可能会用宏做一些非常难看的事情,但我不希望这样做。

有谁知道一种优雅的方式来实现这一点吗?

编辑

应SergeyA要求的显式示例:我想定义一个模板类FFTclass FFT { private: fftw_complex* _data; ... public: execute() { fftw_execute(...); } };

FFT专门化到像

这样的内容
class FFT {
 private:
  fftwf_complex* _data;
  ...
 public:
  execute() {
   fftwf_execute(...); 
  }
};

我不确定我是否完全抓住了问题。使用部分专门化可以解决这样的问题吗?

template<class T>
class Fwd { }
template<>
class Fwd<double> {
    void execute(std::pair<double, double> pp) {
       fftw_execute(pp);
    }
}
template<>
class Fwd<float> {
    void execute(std::pair<float, float> pp) {
        fftwf_execute(pp);
    }
}
// and so on...

另一个解决方案是:

// class
template<T, void(F*)(T*)>
class FFT {
    T* _data;
public:
    FFT(T *data): _data{data} { }
    void execute() {
        (F)(_data);
    }
}
// how to use it
fftw_complex *data = get_them_from_somewhere();
auto fft = new FFT<fftw_complex, fftw_execute>{data};
fft->execute();

符合你的需要吗?我甚至不确定它是否有效,我有点赶时间,但你可以从中得到发展你的正确的想法。