gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:14 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com