以下函数在每个元素上应用仿函数并减少返回值:
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/