1

いくつかのタスクを実行するプロシージャがありますが、入力に応じて2つのわずかに異なる方法で実行します。具体的には、接尾辞ツリーの接尾辞を拡張します。接尾辞がノードで終了する場合、ケースは単純ですが、接尾辞がリーフエッジ内で終了する場合は、追加の作業が必要です。この詳細に言及して、これら2つの動作を単一の関数に含めた理由を説明します(これは、Dan Gusfieldによる接尾辞木構築のUkkonenアルゴリズムの説明の「ルール2」を反映しています:http://www.stanford.edu/~mjkay/gusfield .pdf)。

とにかく、関数がこの作業を完了すると、呼び出し元は2つのケースのどちらが実行されたかを知る必要があります。列挙型は、ケースを明示的にするため(ケースをboolsまたはintに任意にマッピングするのではなく)、この情報を共有するための良い方法だと思いました。

TLDR:発信者と情報を共有するには、この手順を参照して列挙型を渡すか、列挙型を返す必要がありますか?列挙型を参照で渡す方が「副作用のある関数」を回避するので良いと思いますが、これを行うための一般的に「正しい」方法があるかどうかを知りたいと思います。または、代わりに、これは、単一の手順を2つの別々の手順に置き換える必要があることを本当に示唆していますか?

4

4 に答える 4

3

私の意見では、列挙型を返す方が理にかなっています。これは、関数を呼び出した結果であるためです。関数に値を渡す場合、参照を使用する方がはるかに理にかなっており、関数はその値を変更することになっています。

C++標準ライブラリのinsertメソッドにも同様の例があります。unordered_map

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

このメソッドは、値がマップに挿入されたかどうかを示すブール値(ペア内)を返します。これは実際、あなたが扱っているケースと非常によく似ています。

于 2012-07-19T16:52:23.697 に答える
2

関数の結果として列挙型を返す方が、読みやすく、記述しやすいので、より良いと思います。

MyEnum res = myfunc();

それで

MyEnum res;
myfunc(res);
于 2012-07-19T16:52:47.083 に答える
2

列挙型を参照で渡す方が、「副作用のある関数」を回避できるので、より良いと思います。

まったく逆ですが、実際には...一般的に、引数を変更すると、それは副作用です。

何も返さないようにする理由はありません。

于 2012-07-19T17:01:45.800 に答える
0

列挙型は、メモリに格納されている場合は単なる整数値であり、コンパイラは列挙型に使用される値の範囲のチェックを強制します。整数データ型は効率的で安全に値で返すことができると言っています。

関数が実際に複数の値を返す場合を除いて、呼び出し元は列挙型を参照として渡して結果を返す必要はありません。

YourEnum result
result = MyFunc()

PS:値を返すか、呼び出し元にポインター/参照を渡して値を返すかを決定するために私が通常従うルールは、返されるデータが単純または複雑なデータ型であるかどうかです。;)

于 2012-07-19T17:05:10.543 に答える