我正在尝试使用变量模板编写自己的应用函数。这是我的代码:
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(...) ,其目的是存储以后函数调用所需的所有内容?
如果我的问题仍然不清楚,请告诉我。非常感谢你的帮助!