2016-11-23 7 views
1

ここは新しいです。これが私の最初の質問です。Initializer_listを関数のパラメータとして使用し、ループイン関数のために

だから、私はこの機能を持っている:

std::string join(string_initializer_list p_input) const { 
    std::string output; 
    for (auto const & s : p_input) { 
     output.append(s); 
    } 
    return output; 
} 

その機能の主な目的は、新しい文字列を返す文字列のリストに参加することです。

私はstd::initializer_list<std::string>の代わりにstring_initializer_listというエイリアスを使用しました。

少しの研究をした後、私はポインタを渡していたことに気づいたし、これを行うのが最も慣れて正しい方法だったので、パラメータは値渡しされます。

私の質問はforループと関係しています。この場合はより正確ですが、なぜですか? auto const &またはauto &&を使用する必要がありますか?

問題は次のとおりです。initializer_listの文字列を変更したくないので、そのままにしておきたいと思います。その視点からconst &はもっと正しいようですが、私はこの問題についてあなたの意見を知りたいと思います。

C++でテストしてここで多くの質問を読んだ後、私はまだ完全に理解していませんauto &&

また、第1草案では、lvalueでないことを防ぐ方法として、&&としてパラメータを渡しました。

私はこのような迅速なもののため、この機能を使用する:これらstd::string Sの一つは左辺値になってしまうだろう、まれocasionsで

join({"Hello, ", "world"}); 

join({"Hello, ", some_string}); 

メインコンセプトストリングを連結するための安価で簡単な方法を作ることです。これは私が作ったもう1つの機能ですが、上記と似ていますが、異なる文脈のためです。

std::string & concatenate(std::string & p_output, string_initializer_list p_input) const { 
    for (auto const & s : p_input) { 
     p_output.append(s); 
    } 
    return p_output; 
} 

もう一度、私の完璧主義者はそれについてforループを求めています。

+0

あなたの機能で考慮したいことがいくつかあります。まず、長さの合計を最初に計算し、それを埋め込む前にそのサイズの文字列を作成したいと思うでしょう。ループについては、基本的なオブジェクト型がconst型の文字列であるため、汎用オート&&auto &&を使用するかどうかは関係ありません。したがって、汎用参照の型減算はconst文字列&const auto&wouldと同じでなければなりません。 (より効率的な関数は実際にはループの代わりにバリデーショナルテンプレートを使用したものかもしれません) – Charlie

+0

ありがとう!私は最終的な長さを計算するために別のループを使用する必要がありますし、最後の文字列の予約を呼び出しますか?別のループが少しすぎないでしょうか?私はあなたのことを理解しています。私はvariadicテンプレートの事を知っていた、テンプレートソリューションの問題は、よく、彼らはジェネリックでなければならないと私はちょうど文字列で動作する何かをしたい、また、文字列連結のvariadicテンプレートの多くの実装は、ほとんどのものは文字列に変換されます。 –

答えて

1

イテレータタイプstd::initializer_list<T>は、const T*です。したがって、逆参照すると、左辺の値はconst Tになります。どちらの方法でも左辺の参照がconst Tになるので、const auto&またはauto&&のどちらを使用して反復するかは関係ありません。私は可読性のためconst auto&をここで好むでしょう--- auto&&は、物が左辺値または右値のいずれかである可能性のあるテンプレートコードを使って作業していることを示唆します。

+0

応答ありがとうございます;) –

関連する問題