c++ - 可能返回值也可能不返回值的函数的 Iterator-reducer 模式

标签 c++ c++11

以下函数在每个元素上应用仿函数并减少返回值:

template <class FCT, class RED>
RED::TYPE forAllElements(FCT functor, RED reducer){
  for(/* all elem in elements */){
    reducer(functor(elem));
  }
  return reducer.value;
}

现在,有时我可能希望只对所有元素调用 functor,而不减少任何东西。基本上,我想要这样的东西:

class FunctorThatReturnsNothing{
  void operator() (Elem e){
    // do something, return nothing...
  }
}

class DummyReducer{
  using TYPE = void; // ??? something like that ???

  template <class FCT>
  void operator() (/* ??? what here */){
    // do nothing...
  }
}

forAllElements(FunctorThatReturnsNothing(), DummyReducer());

但这不会编译,因为我有 reducer(functor(elem)),其中将 void 函数的不存在的返回值作为参数。

有没有一种方法可以使其适用于 void 仿函数,而无需为 void 和非 void 情况复制 forAllElements?

(对于怀疑 XY 问题的人:我基本上知道迭代和减少的不同方法,我认为所提供的回调方法适合我的情况。我只是想知道如何避免“返回”的重复代码value + reducing”和“just callback”的情况。)

最佳答案

我认为您可以创建一个 VoidReducer 类,但您需要 return reducer.getvalue(); 而不是 return reducer.value;。然后您只需制作 void VoidReducer::getvalue(){}

我还没有对此进行测试,但这个想法应该可行。如果 f 和当前函数的返回类型都为 void,则您可以return f();

编辑
现在我更仔细地阅读了这个问题,我发现您要问的问题是行 reducer(functor(elem));
为此,我将基于 decltype(functor(elem)) 进行编译时分派(dispatch)。

template <class Functor, class Reducer, class Elem>
void Combine(Functor functor, Reducer & reducer, Elem elem, std::true_type)
{
  functor(elem);
}

template <class Functor, class Reducer, class Elem>
void Combine(Functor functor, Reducer & reducer, Elem elem, std::false_type)
{
    reducer(functor(elem));
}

template <class Functor, class Reducer, class Elem>
void Combine(Functor functor, Reducer & reducer, Elem elem)
{
    Combine(functor, reducer, elem, std::is_same<decltype(functor(elem)), void>());
}

然后调用 Combine 而不是 reducer(functor(elem)) 将正确减少 functor 的返回值当且仅当它不是作废。

PS:根据口味添加引用和 std::forward 调用。

关于c++ - 可能返回值也可能不返回值的函数的 Iterator-reducer 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36939195/

相关文章:

c++ - 记住最初的对象,它只能管理共享内存

c++ - 如果类有 const 变量,为什么我能够将一个对象复制到另一个对象中?

c++ - 使用别名模板时无法将 `std::unique_ptr` 分配给 clang 中的基类

c++ - 传递带有默认值的函数作为忽略它们的参数

c++ - 通过 std::function 包装重载函数

c++ - 多个 shared_ptr 存储相同的指针

c++ - 共享指针递归删除递归数据结构栈溢出

c++ - 为什么使用 'operator++' 进行引用初始化会出错

c++ - 为什么这个函数是false,来自TCP服务器 session 类成员socket_.is_Open

C++ 模板 - 需要主要表达式