我试图通过采用一种功能更强的编程风格,将我的临时编程分解为模块化和可重用的组件,但这使我将所有的东西都写了两遍。
例如,我有一个状态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
编写了一个X
函数。这是一种很好的风格,还是我在自欺欺人?我能避免编写make_X
函数吗?还是我应该改变整个方法?
发布于 2014-01-28 03:45:51
这是通常的做法,也在C++标准库中。因此,您在正确的轨道上,没有办法避免编写make_函数,因为无法按照类/结构的要求直接进行扣减。
https://stackoverflow.com/questions/21404684
复制