我试图通过采用更函数式的编程风格将我的临时编程提炼成模块化和可重用的组件,但这让我把所有东西都写了两次。
例如,我有一个状态 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);
为了提供一个漂亮的界面,我最终为每个模板化函数对象X
编写了一个make_X
函数。这是好的风格还是我在自欺欺人?我可以避免编写 make_X
函数吗?还是我应该改变整个方法?
最佳答案
这是通常的做法,在 C++ 标准库中也是如此。所以你走在正确的轨道上,没有办法避免编写 make_ 函数,因为对于类/结构,推导无法按要求直接工作。
关于C++ 函数对象模板参数推导风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21404684/