変数テンプレートを使用して独自の適用関数を作成しようとしています。ここに私が持っているコードがあります:
template<typename...>
struct types{
};
template<typename T, typename... Args>
struct Func{
template<typename F, typanem... Types>
T call(F f, std::tuple<Types...>& params, Args... args){
return _call(f, params, types<Types...>{}, args...);
}
template<typename F, typename Tuple, typename Head, typename... Tail, typename... Args>
T _call(F f, Tuple& t, types<Head, Tail...>, Args&&... args){
_call(f, t, types<Tail...>{}, std::forward<Args>(args)..., std::get<sizeof...(Arg)>(t).DrawSample()));
}
T _call(F f, Tuple& t, types<>, Args... vs){
return f(vs...)
}
};
上記のコードを問題なくコンパイルして実行できます。ここで、関数 call(...) を遅延して呼び出したいと思います。つまり、計算に必要なすべてのパラメーターを渡すことで、最初に関数を作成できます。
int getMax(float f1, float f2, float f3){
if(f1 >= f2 && f1 >= f3){
return 1;
}
if(f2 >= f1 && f2 >= f3){
return 2;
}
if(f3 >= f1 && f3 >= f2){
return 3;
}
}
Func<int> func;
//Gaussian(mu, sd) is an object which can generate random values based on Gaussian
//distribution described with mu(mean) and sd(standard deviation).
Gaussian *g1 = Gaussian(0.3, 0.2);
Gaussian *g2 = Gaussian(0.2, 0.3);
Gaussian *g3 = Gaussian(0.3, 0.3);
func.setCall(getMax, std::make_tuple(*g1, *g2, *g3);
cout<<func.DrawSample();
関数を構築した後、func.DrawSample() のクエリを作成するたびに、getMax() 関数の結果を遅延取得したいと考えています。内部では、おそらく DrawSample() が call(...) を呼び出します。ただし、後で関数呼び出しに必要なすべてを格納することを目的とする setCall(...) を作成するために、上記のコードを変更する方法はありますか?
私の質問がまだ不明な場合はお知らせください。助けてくれてどうもありがとう!