我注意到python库scipy测试了FFTW(在fftw_dct.c
中),它使用一个聪明的预处理器宏来在float和double精度之间进行交换。
#ifdef DCT_TEST_USE_SINGLE
typedef float float_prec;
#define PF "%.7f"
#define FFTW_PLAN fftwf_plan
#define FFTW_MALLOC fftwf_malloc
#define FFTW_FREE fftwf_free
#define FFTW_PLAN_CREATE fftwf_plan_r2r_1d
#define FFTW_EXECUTE fftwf_execute
#define FFTW_DESTROY_PLAN fftwf_destroy_plan
#define FFTW_CLEANUP fftwf_cleanup
#else
typedef double float_prec;
#define PF "%.18f"
#define FFTW_PLAN fftw_plan
#define FFTW_MALLOC fftw_malloc
#define FFTW_FREE fftw_free
#define FFTW_PLAN_CREATE fftw_plan_r2r_1d
#define FFTW_EXECUTE fftw_execute
#define FFTW_DESTROY_PLAN fftw_destroy_plan
#define FFTW_CLEANUP fftw_cleanup
#endif
我知道宏 EVIL ,但这似乎是一种合理透明的方式,可以使用允许单精度或双精度方法解决问题的库。我们创建了一个模板包装器方法,模仿 float 和 double 之间的交换,但这似乎是一种过于复杂的方法,尤其是在考虑可读性时。
假设某个类的 float 和 double 变体不需要在可执行文件中可用,是否有任何其他方法可能更好地粘附好的C ++设计原则并不过分复杂?我更喜欢适用于C ++ 03的答案,因为我们需要集成一个适用于遗留代码的设计。