通过引用返回枚举或传递枚举?

时间:2012-07-19 16:47:33

标签: c++ enums

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

无论如何,一旦该功能完成此工作,调用者需要知道这两个案例中的哪一个被遵循。我认为枚举是一种分享这些信息的好方法,因为它使案例明确(而不是任意地将案例映射到bool或int)。

TLDR:要与调用者共享信息,我应该通过引用此过程传递枚举还是返回枚举?我觉得通过引用传递枚举是更好的,因为它避免了具有“副作用的功能”但是想知道是否通常有“正确”的方式来做到这一点。或者,或者,这是否真的表明我应该用两个单独的程序替换我的单个程序?

4 个答案:

答案 0 :(得分:3)

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

您可以在C ++标准库中unordered_map的{​​{3}}方法中看到类似示例:

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

该方法返回一个布尔值(在一对内),说明该值是否已插入到地图中。这实际上与您正在处理的情况非常相似。

答案 1 :(得分:2)

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

MyEnum res = myfunc();

然后

MyEnum res;
myfunc(res);

答案 2 :(得分:2)

  

我觉得通过引用传递enum更好,因为它避免了“带副作用的函数”

恰恰相反,实际上......通常,如果你修改你的论点,那就是副作用。

没有理由避免返回任何东西。

答案 3 :(得分:0)

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

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

YourEnum result
result = MyFunc()

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