#include <type_traits>
#include <fftw3.h>
template<class Real>
class foo
{
public:
foo(Real* x, size_t length,
typename std::enable_if<std::is_same<double, Real>::value>::type* = nullptr)
{
y = fftw_alloc_real(length);
fftw_plan plan = fftw_plan_r2r_1d(length, x, y, FFTW_REDFT10, FFTW_ESTIMATE);
fftw_execute_r2r(plan, x, y);
fftw_destroy_plan(plan);
}
foo(Real* x, size_t length,
typename std::enable_if<std::is_same<float, Real>::value>::type* = nullptr)
{
y = fftwf_alloc_real(length);
fftwf_plan plan = fftwf_plan_r2r_1d(length, x, y, FFTW_REDFT10, FFTW_ESTIMATE);
fftwf_execute_r2r(plan, x, y);
fftwf_destroy_plan(plan);
}
private:
Real* y;
};
int main()
{
std::vector<double> x{12, 83, 96.3};
foo<double> fd(x.data(), x.length());
std::vector<float> xf{12, 82, 96.2};
foo<float> ff(x.data(), x.length());
}
のコンパイルに失敗し
をコンパイルすることを拒否します私の構文やstd::enable_if
の理解が間違っている何
test.cpp:14:33: error: no type named 'type' in 'std::__1::enable_if<false, void>'; 'enable_if' cannot be used to disable this declaration
typename std::enable_if<std::is_same<float, Real>::value>::type* = nullptr)
これはコンパイルされませんか? FFTWのテンプレート化されていないコードを依然として呼び出すテンプレートを使用できるように、修正は何ですか?
をこれは、あなたがSFINAEを行う方法ではありません。 – StoryTeller
ありがとう、なぜ説明できますか? – user14717
置換はテンプレートパラメータにのみ適用されるためです。あなたの2つのc'torsはテンプレートではありません。テンプレートは、インスタンス化されたときに両方とも整形式である必要があります。 – StoryTeller