以下函数在每个元素上应用一个函子并减小返回值:
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- void
case重复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] 删除。
我来说两句