如何将处理不同数字类型的C函数库包装到c++模板类中
How to wrap a C function library that works with different numeric types into a C++ template class
我想使用C库中的代码(我的具体示例:FFTW)来实现一个c++类模板。C库定义了一些数据类型和函数,它们做同样的事情,但对不同类型的基本数字类型,例如fftw_complex(双精度对象对)和fftwf_complex(浮点数对);Fftw_execute()和fftwf_execute(),等等
我想实现一个只依赖于这个基本类型的类模板,例如
FFT
在这个例子中,库遵循了所有函数和数据都有相同的前缀来指定它们使用的数据类型的约定,所以我可能会用宏做一些非常难看的事情,但我不希望这样做。
有谁知道一种优雅的方式来实现这一点吗?
编辑
应SergeyA要求的显式示例:我想定义一个模板类FFT 和 FFTclass FFT {
private:
fftw_complex* _data;
...
public:
execute() {
fftw_execute(...);
}
};
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();
符合你的需要吗?我甚至不确定它是否有效,我有点赶时间,但你可以从中得到发展你的正确的想法。
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 用pybind11包装C++抽象类时出错
- 为左值和右值的包装器实现C++范围
- C结构,其指针将被包装在unique_ptr中
- 如何包装第三方DLL在R中使用
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 将 N-arg 函数包装到另一个函数中
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 包装一个对象并假装它是一个 int
- 使用 Python Extension API 包装复杂C++类
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 包装C++类时不完整的类型 GLFWwindow
- 将函数包装器转换为 std::function
- C++函数包装器来捕获某些信号
- 创建包装升压适配器的自定义范围类
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?
- 使用运算符*重载包装矩阵乘法