C 函数对象模板参数扣除样式

C++ function-object template argument deduction style

本文关键字:样式 参数 函数 对象      更新时间:2023-10-16

我正在尝试通过采用更有功能的编程样式将临时编程提炼成模块化和可重复使用的组件,但这让我写了两次。

作为一个例子,我有一个状态stateT state,该状态由可配置的函数-Object 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_函数,因为推论无法按要求直接适用于类/结构。