2

参照渡し関数は通常、値渡し関数とどのように区別されますか? 例えば:

template <typename T>
void sort(std::vector<T>& source); // Sorts source.

// Versus...

template <typename T>
std::vector<T> sort(std::vector<T> source); // Returns a sorted copy of source.

これら 2 つの関数はあいまいです。そのうちの 1 つは名前を変更するか、完全に削除する必要があります。

この状況をどのように回避できますか? どちらかの形式を優先する必要がありますか? または、それらを区別するための一般的な命名ガイドラインはありますか?

4

3 に答える 3

6

それらに異なる名前を付けることはできませんか?sortedたとえば、機能バージョンに名前を付けます。

関数 (この場合は関数テンプレート) をオーバーロードできるからといって、そうしなければならないわけではありません。

ところで、「命令型バージョン」に関して「機能バージョン」を実装できます。

template <typename T>
void sort(std::vector<T>& source)
{
    // sort in place
}

template <typename T>
std::vector<T> sorted(std::vector<T> copy)
{
    sort(copy);
    return copy;
}
于 2011-05-18T17:01:58.890 に答える
2

FredOverflow は頭に釘を打ちました。ただし、「または、それらを区別するための一般的な命名ガイドラインはありますか?」という質問に答えるには、一貫性があることを確認してください。たとえば、例の 2 番目の関数名の SortCopy のようなものです。それがSortCopy、SortCpy、Sort_Copyであるかどうかは関係ありません..重要なのは、コード全体で一貫性があることです(たとえば、コピーに作用するすべての関数には「コピー」プレフィックスが付いています-コピーを持つ関数ではなく、次のコピーなど...)。

于 2011-05-18T17:10:35.270 に答える
0

通常、可能であれば非定数参照を渡さず、2番目の形式を使用することをお勧めします。これは、第1に、戻り値を別の関数に渡したい場合に第2の並べ替えがより適切に機能するためです。第2に、コンパイラのオプティマイザがほとんどの場合に不要なコピーを処理するためです。 TMPは、それが実際には戻り値であるという事実を検出せず、あらゆる種類の関数オブジェクトコンテキストでの関数の使用を防ぎます。

于 2011-05-18T17:05:57.793 に答える