我正在尝试通过采用更具功能性的编程风格将我的临时编程提炼为模块化和可重用的组件,但这让我写了两遍。
例如,我有一个状态stateT state
,由可配置的函数对象step
更新。
template<typename sT, typename T1, typename T2>
struct Step {
T1 func1;
T2 func2;
Step(T1 f1, T2 f2) : func1(f1), func2(f2) {}
sT operator()(sT state) {
state.A = func1(state.A);
... using func2() and internals of state ...
}
};
这样我就不必输入
了auto step = Step<stateT,typename_of_func1,typename_of_func2>{func1, func2};
我做了make_stepper
template<typename sT, typename T1, typename T2>
auto make_stepper(sT state, T1 func1, T2 func2) {
return Step<sT,T1,T2>(func1, func2);
}
现在我可以写
了stateT state{...constructor arguments...};
auto step = make_stepper(state, func1, func2);
state = state(step);
为了提供一个好的接口,我最终为每个模板化的函数 - 对象make_X
编写X
函数。这是好风格还是我只是在愚弄自己?我可以避免编写make_X
函数吗?或者我应该改变整个方法吗?
答案 0 :(得分:2)
这是通常的方式,也在C ++标准库中。所以你走在正确的轨道上并且没有办法避免编写make_function,因为演绎无法直接对类/结构进行处理。