あなたのコンパイラがある理由:あなたはポートレガシーコード(クラステンプレートに機能を適応させる)する必要がある場合
// Class acts like a function - also known as functor.
template<typename T, int a, int b>
class f
{
int operator()(T v)
{
return v*a-b; // just do something for example
}
};
template<typename T, int a, int b, template<typename,int,int> class func>
class C
{
int f()
{
return func<T,a,b>(3);
}
};
int main()
{
C<float,3,2, f> c;
}
を...そして適応バージョンクラスとしてC
の最後のテンプレートパラメータに関数(f
)を渡しているという不満があります。
関数をテンプレートパラメータとして渡すことはできないため、関数ポインタまたは関数ファンクタを使用する必要があります。そして、ファンクターは間違いなくこれを行うためのよりクリーンな方法です。
したがって、ファンクターを使用せずに、あなたが望むものを達成することは可能ですが、実際には試してはいけません。
あなたはこのような何かを見ていることになる関数ポインタを使用したい場合:私はあなたがc
の宣言でコードの重複を排除することができるだろうとは思わないような場合には
template<typename T, int a, int b, int (*func)(T)>
class C{
int f(){
return (*func)(3);
}
};
int main(){
C< float,3,2,&f<float,3,2> > c;
}
、しかし私は間違っているかもしれません。あなたは少し策略を通してそれを解決することができ
達成しようとしているのは正確ですか? – nijansen
このコードの実行中にコンパイラがクラッシュしました。 – Saksham
@nijansenはMSVS2010が安定していませんか? – Saksham