可能会或可能不会返回值的函数的迭代器缩减模式

麦可

以下函数在每个元素上应用一个函子并减小返回值:

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函子,而无需为avoid和non- voidcase重复forAllElements

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

爵士先生

我认为您可以上一VoidReducer堂课,但是return reducer.value;您需要return reducer.getvalue();然后,您只需做出void VoidReducer::getvalue(){}

我没有测试过,但是这个想法应该可行。return f();如果f当前函数和当前函数都具有返回类型,则允许您这样做void

编辑
现在,我更加仔细地阅读了问题,我发现您要问的问题是line reducer(functor(elem));
为此,我将基于进行编译时调度decltype(functor(elem))

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

附言:散布参考和std::forward品味电话。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

取消编组可能会或可能不会返回数组的JSON?

加速可能会或可能不会返回结果的大量SELECT查询

调用可能会或可能不会发出http请求的函数

如何设置存储过程参数可能会或可能不会由用户传递值?

全局变量在每个视图上可能会或可能不会更改Laravel 5.2

使用 Logstash Aggregate Filter 插件处理可能会或可能不会被排序的数据

Laravel Eloquent在恋人关系中可能会或可能不会有结果

正则表达式用于子字符串捕获,但子字符串可能会或可能不会被转义的双引号绑定

封装可能返回也可能不返回值的代码

使用sed可能会/可能不会跨越多行的定界符

如何从可能会/可能不会以单引号开头的字符串中提取单词

函数不会在所有代码路径上返回值。使用结果时,运行时可能会出现空引用异常

可能会产生BigInteger值冲突?

获取可能会更改或不会更改的值的最有效方法?

正则表达式-匹配直到可能出现或可能不会出现的组

正则表达式:排除捕获可能存在或可能不存在的模式

如何获取python函数的所有可能的返回值?

如何从可能会修改的链接中打开模式

“错误:闭包可能会超过当前函数的寿命”,但不会超过当前函数的寿命

这个迭代器可能会出什么问题?

如何使函数的返回值可迭代?

管道式rxjs运算符可能会受到后续运算符的返回值的影响吗?

iOS“控件可能会达到非无效函数的结尾”

捕获JavaScript迭代器的返回值

可能会忽略KeyError?

MySQL触发器可能会自动失败吗?

javascript 函数,不会返回值?

SQL函数卡住,不会返回值

绝对值函数“ fabsf”的参数类型为“ double”,但参数类型为“ float”,这可能会导致值被截断?