如何将使用不同数值类型的C函数库包装到C++;模板类 我想使用C库中的代码(我的具体例子:)来实现C++类模板。C库定义了一些数据类型和函数,它们做相同的事情,但在不同类型的基本数字类型上,例如fftw_复数(一对双精度)和fftwf_复数(一对浮点);fftw_execute()与fftwf_execute()等
我想实现一个只依赖于这个基本类型的类模板,例如 FFT,FFT,FFT等 在本例中,库遵循的约定是,所有函数和数据都具有相同的前缀,用于指定它们使用的数据类型,因此我可能可以对宏执行一些非常难看的操作,但我不希望这样做 有人知道一种优雅的方法来实现这一点吗 编辑 SergeyA要求的一个显式示例:我想定义一个模板类FFT,使FFT专门用于如何将使用不同数值类型的C函数库包装到C++;模板类 我想使用C库中的代码(我的具体例子:)来实现C++类模板。C库定义了一些数据类型和函数,它们做相同的事情,但在不同类型的基本数字类型上,例如fftw_复数(一对双精度)和fftwf_复数(一对浮点);fftw_execute()与fftwf_execute()等,c++,templates,design-patterns,C++,Templates,Design Patterns,我想实现一个只依赖于这个基本类型的类模板,例如 FFT,FFT,FFT等 在本例中,库遵循的约定是,所有函数和数据都具有相同的前缀,用于指定它们使用的数据类型,因此我可能可以对宏执行一些非常难看的操作,但我不希望这样做 有人知道一种优雅的方法来实现这一点吗 编辑 SergeyA要求的一个显式示例:我想定义一个模板类FFT,使FFT专门用于 class FFT { private: fftw_complex* _data; ... public: execute() { ff
class FFT {
private:
fftw_complex* _data;
...
public:
execute() {
fftw_execute(...);
}
};
class FFT {
private:
fftwf_complex* _data;
...
public:
execute() {
fftwf_execute(...);
}
};
及
我喜欢这样的东西
class 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...
模板
类Fwd{}
模板
第四类{
void执行(std::pair pp){
fftw_执行(pp);
}
}
模板
第四类{
void执行(std::pair pp){
fftwf_执行(pp);
}
}
//等等。。。
另一种解决方案可能是:
// 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();
//类
模板
类FFT{
T*_数据;
公众:
FFT(T*data):_data{data}{}
void execute(){
(F) (_)数据;
}
}
//如何使用它
fftw_complex*data=从某处获取它们();
自动fft=新fft{data};
fft->execute();
它适合你的需要吗?
我甚至不确定它是否有效,我有点赶时间,但你可以从中得到一个想法来开发你的合适的一个。不确定你的意思是什么。也许伪代码会有帮助?基本上这就是我想要的,只是这些类型和函数到处都是,所以我基本上必须复制/粘贴整个类定义,基本上只是用fftwf、fftwl和fftwq替换前缀fftw,以支持不同的浮点宽度。好的,我想你更喜欢一个简单包装函数的委托。你看过那里吗?我在这方面考虑得更多,它确实有效,但我得到了:模板类uuu FFT{…};如果我们想在模板中再次使用该类,这就不太令人满意了。刚才我在这篇stackoverflow文章中找到了如何制作模板化别名。我将尝试根据我的需要发布结果。很好,如果您需要帮助,请告诉我,并最终接受其中一个回答以结束问题。我问了一个新的相关问题(这将提供解决方案):