27

std::ignorecppreference からドキュメントを読んでいます。このオブジェクトの真の目的を理解するのは非常に難しいと思います。また、サンプル コードではあまりうまくいきません。たとえば、次のコードでは、insertedtrue に設定する方法と理由を教えてください。私にはあまり意味がありません。

#include <iostream>
#include <string>
#include <set>
#include <tuple>

int main()
{
    std::set<std::string> set_of_str;
    bool inserted;
    std::tie(std::ignore, inserted) = set_of_str.insert("Test");
    if (inserted) {
        std::cout << "Value was inserted sucessfully\n";
    }
}

誰かが私にコードを説明できれば幸いです。ありがとう。

4

2 に答える 2

19

デイブの答えはかなり良いと思いますが、なぜそのようなアプローチを使用するのかを少し説明したいと思います。

Scala、Haskell、Python などの他の言語では、通常、タプル (2 つの要素のタプルのペア) が存在し、それらを変数に割り当てる慣用的な方法があります。

(var1,...,varN) = func_returning_tuple()

これには、コードのセマンティック値を拡張し、読みやすさを向上させる目的があります。そうしないと、要素にセマンティクスのない単一の変数 (t.first など) があり、C++ ではタプルの値にアクセスできます。使用する必要があります:

varN = std::get<N>(my_tuple);

したがって、tie のみを使用すると、次のようにサンプル コードを読みやすくすることができます。

std::tie( element_iterator, inserted ) = set_of_str.insert("test");

そして、分離された変数を自由に使用します。これにより、他の人 (および自分自身) がコードの次のステートメントを読み取る方法が改善されます。

std::ignoreは、返されるものを気にしない場合に使用されます。他の言語では、このリソースもあります。たとえば、Scala では、これはアンダースコアです。たとえば、マップで挿入関数を使用し、値が既に存在する場合、ペアを返すだけ(iterator,false)なので、キーのイテレータが必要な場合は、マップに既に存在するかどうか気にしなくても、この行でそれを行います:

std::tie( element_iterator, std::ignore ) = set_of_str.insert("test");

これが、タプルとペアの可読性の問題を C++ が解決する方法です。

于 2013-05-02T22:31:29.977 に答える