返回enum或通过引用传递enum

return enum or pass enum by reference?

本文关键字:enum 引用 返回      更新时间:2023-10-16

我有一个过程,它执行一些任务,但根据其输入,以两种略有不同的方式执行。具体来说,它扩展了后缀树中的一个后缀;如果后缀在节点处结束,情况很简单,但当后缀在叶边缘内结束时,需要做一些额外的工作。我提到这个细节是为了解释为什么我把这两种行为包含在一个函数中(它反映了Dan Gusfield对Ukkonen后缀树构造算法的描述的"规则2":http://www.stanford.edu/~mjkay/gussfield.pdf).

不管怎样,一旦函数完成了这项工作,调用方就需要知道遵循了这两种情况中的哪一种。我认为枚举是共享这些信息的好方法,因为它使用例显式(而不是任意将用例映射到bool或int)。

TLDR:要与调用方共享信息,我应该通过引用此过程传递枚举还是返回枚举?我觉得通过引用传递枚举更好,因为它避免了"有副作用的函数",但我想知道是否有通常"正确"的方法。或者,这真的意味着我应该用两个单独的程序取代我的单一程序吗?

在我看来,返回枚举更有意义,因为它是调用函数的结果。如果将值传递给函数,并且函数应该修改该值,那么使用引用将更有意义。

您可以在C++标准库中的unordered_mapinsert方法中看到类似的示例:

template <class P> 
std::pair<iterator, bool> insert( P&& value );

该方法返回一个布尔值(在一对中),说明该值是否插入到映射中。这实际上是一个与你正在处理的案件非常相似的案件。

我认为最好将枚举作为函数的结果返回,因为它更可读,编写起来更简单:

MyEnum res = myfunc();

然后

MyEnum res;
myfunc(res);

我觉得通过引用传递枚举更好,因为它避免了"有副作用的函数"

事实恰恰相反。。。一般来说,如果你修改你的论点,那会产生副作用。

没有理由不归还任何东西。

枚举存储在内存中时只是整数值,编译器强制检查用于枚举的值的范围。已经说过,整数数据类型通过值返回是有效和安全的。

除非函数真的返回多个值,否则调用者不需要将枚举作为引用传递并返回结果。

YourEnum result
result = MyFunc()

PS:我通常遵循的规则是,如果返回的数据是简单或复杂的数据类型,那么决定是否应该返回值,或者让调用方传递指针/引用并返回值。)