[解決済み] std::tieはどのように機能するのですか?
質問
私は
std::tie
あまり深く考えずに。うまくいくので、そのまま受け入れています。
auto test()
{
int a, b;
std::tie(a, b) = std::make_tuple(2, 3);
// a is now 2, b is now 3
return a + b; // 5
}
しかし、この
黒魔術
が働くのでしょうか?で作成された一時的なものは、どのように機能するのでしょうか?
std::tie
変更
a
と
b
? 言語の機能ではなくライブラリの機能なので、きっと自分たちで実装して理解できるものだと思うので、こちらの方が興味深いです。
解決方法は?
核となる考え方を明確にするために、より基本的な例に落とし込んで考えてみましょう。とはいえ
std::tie
は、より多くの値を(タプルで)返す関数に便利ですが、1つの値で十分理解できます。
int a;
std::tie(a) = std::make_tuple(24);
return a; // 24
前に進むために必要なこと。
-
std::tie
は、参照のタプルを構築して返します。 -
std::tuple<int>
とstd::tuple<int&>
は2つの全く異なるクラスで、同じテンプレートから生成されたということ以外、両者の間には何の関連性もありません。std::tuple
. -
タプルには
<ブロッククオートoperator=
異なる型(ただし同じ番号)のタプルを受け入れ、各メンバーは個別に割り当てられる。 参照 :template< class... UTypes > tuple& operator=( const tuple<UTypes...>& other );
(3) すべてのiについて
std::get<i>(other)
をstd::get<i>(*this)
.
次は、邪魔にしかならない関数を取り除くことで、このようなコードに変換することができます。
int a;
std::tuple<int&>{a} = std::tuple<int>{24};
return a; // 24
次のステップは、これらの構造体の内部で何が起こっているかを正確に確認することです。
このために、私は2つのタイプを作成します。
T
の代用品です。
std::tuple<int>
と
Tr
置換基
std::tuple<int&>
を、操作のために必要最低限まで削ぎ落としたものです。
struct T { // substituent for std::tuple<int>
int x;
};
struct Tr { // substituent for std::tuple<int&>
int& xr;
auto operator=(const T& other)
{
// std::get<I>(*this) = std::get<I>(other);
xr = other.x;
}
};
auto foo()
{
int a;
Tr{a} = T{24};
return a; // 24
}
そして最後に、私は構造体をすべて取り除くのが好きです(まあ、100%等価ではありませんが、私たちにとっては十分に近く、十分に明示的で、それを許容します)。
auto foo()
{
int a;
{ // block substituent for temporary variables
// Tr{a}
int& tr_xr = a;
// T{24}
int t_x = 24;
// = (asignement)
tr_xr = t_x;
}
return a; // 24
}
だから、基本的には
std::tie(a)
へのデータ・メンバ・リファレンスを初期化します。
a
.
std::tuple<int>(24)
は、値を持つデータ・メンバを作成します。
24
そして、代入では、最初の構造体のデータメンバリファレンスに24を代入しています。しかし,そのデータメンバは
a
であるため、基本的には
24
を
a
.
関連
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む