2016-12-22 16 views
6

私はstd::string_viewというメソッドを使用し、NULL終了文字列をパラメータとして取ります。例:apiでstd :: string_viewを使用すると、nullで終わる文字列が返されます。

void stringFunc(std::experimental::string_view str) { 
    some_c_library_func(/* Expects null terminated string */); 
} 

問題は、この状況を処理する適切な方法は何ですか? str.to_string().c_str()は唯一のオプションですか?私は実際にこのメソッドでstd::string_viewを使用したいと思います。なぜなら、異なるタイプの文字列を渡すからです。

答えて

4

あなたはstd::string_viewて文字列を変更することはできません。したがって、末尾に「'\0'」文字を追加することはできません。したがって、他の場所の文字列をコピーして'\0' -terminatorを追加する必要があります。あなたが十分に短い場合は、スタックに文字列を置くことによってヒープ割り当てを避けることができます。あなたが知っているのは、std::string_viewがヌルで終了する文字列の一部であることがわかっている場合は、末尾の文字が'\0'文字であるかどうかをチェックし、その場合はコピーを避けることができます。それ以外にも、最適化の余地はあまりありません。

+0

VLAの使用に最適です。 – user1095108

+4

@ user1095108しかし、C++でVLAを可能にするコンパイラは非標準の拡張を適用しているので、VLAは決してうまくいかないと言います。 :P –

+0

これらは実質的にどこでもallocaを通してサポートされていますので、移植可能にすることができます – user1095108

4

あなたは確かにstd::experimental::string_viewdataを呼び出すべきではありません:のbasic_string ::データとは異なり

()と文字列リテラル、データは()null終端でないバッファに ポインタを返すことがあります。

だから上のto_stringdataを呼び出す:

void stringFunc(std::experimental::string_view str) { 
    some_c_library_func(str.to_string().data()); 
} 

か:

void stringFunc(std::experimental::string_view str) { 
    std::string real_str(str); 
    some_c_library_func(real_str.data()); 
} 
8

zstring_viewという代替のstring_viewクラスを作成してこの問題を解決しました。私的にはstring_viewから継承され、そのインターフェイスの多くを含んでいます。

zstring_viewstring_viewから作成できません。また、末尾から要素を削除するAPIのstring_viewは、インターフェイスの一部ではないか、zstring_viewの代わりにstring_viewを返します。

NUL終端の文字列ソース:std::stringなどから作成できます。私は特別なユーザ定義のリテラルサフィックス(_zsv)を作成しました。

考えられるのは、非ヌル終了文字列を手動でzstring_viewに入れない限り、すべてzstring_viewはNULで終了する必要があります。 std::stringのように、NUL文字は文字列のサイズの一部ではありませんが、があります。です。

私はCのインターフェイスを扱うのに非常に便利だと思います。

+0

私は同じことをやっただけで、インターフェイスがとてもうれしくてconst std :: string&をパラメータとして使う最後の理由を取り除きます。あなたは私的継承を使って多くの利便性を失う(比較やstring_viewへの変換のように) - インタフェースを見れば、問題のあるミューテータは削除されているようだ*** ***修正とスワップ - 私はただスワップを再実装し、remove_ ***は実装されていない非公開のメンバーとして修正されており、すべて正常に動作しているようですので、実際にstd :: string_viewから公に継承することができます。将来はstring_viewに新しいミューテータが追加されているだけです。 – Shaggi

+0

それは悪いスタイルだと言えるかもしれませんが。さらに、zstring_viewsをstring_view&を取る関数に渡すことに問題があります(これは2つ以上の方法で変です...) – Shaggi

関連する問題