如何将使用不同数值类型的C函数库包装到C++;模板类 我想使用C库中的代码(我的具体例子:)来实现C++类模板。C库定义了一些数据类型和函数,它们做相同的事情,但在不同类型的基本数字类型上,例如fftw_复数(一对双精度)和fftwf_复数(一对浮点);fftw_execute()与fftwf_execute()等

如何将使用不同数值类型的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

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

FFT,FFT,FFT等

在本例中,库遵循的约定是,所有函数和数据都具有相同的前缀,用于指定它们使用的数据类型,因此我可能可以对宏执行一些非常难看的操作,但我不希望这样做

有人知道一种优雅的方法来实现这一点吗

编辑

SergeyA要求的一个显式示例:我想定义一个模板类FFT,使FFT专门用于

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文章中找到了如何制作模板化别名。我将尝试根据我的需要发布结果。很好,如果您需要帮助,请告诉我,并最终接受其中一个回答以结束问题。我问了一个新的相关问题(这将提供解决方案):