C++ 函数对象模板参数推导风格

标签 c++ functional-programming

我试图通过采用更函数式的编程风格将我的临时编程提炼成模块化和可重用的组件,但这让我把所有东西都写了两次。

例如,我有一个状态 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/

相关文章:

c++ - 如何从文件中读取数据到类的数组中

c++ - 删除对象列表中的相似项目

c++ - 使用多线程时 Qt Creator 崩溃

functional-programming - Agda:我能证明具有不同构造函数的类型是不相交的吗?

c++ - 带有字符显示的 vector

c++ - 在单字符行上调用时由 CRichEditCtrl::GetLine() 添加的虚假 '\r'?

function - scheme2lisp::define 函数并将其作为参数传递

JavaScript:折叠无限流(生成器函数)

javascript - 过滤对象的数组属性而不改变对象本身

javascript - 你如何柯里化(Currying)任意数量的任何 javascript 函数?