C++幼女先輩

プログラミング成分多め

2017-05-01から1ヶ月間の記事一覧

右辺値参照~完全転送まで100%理解するぞ! part8 おまけ。

おまけ 可変引数テンプレートの Parameter Bagを展開しながら 全部出力する #include<iostream> using namespace std; struct Concat{ template <class... T> void operator ()(T&&... t) { concat_(std::forward<T>(t)...); } private: void concat_() { } template <class Head, class... Tail> void concat_(He</class></t></class...></iostream>…

右辺値参照~完全転送まで100%理解するぞ! part7 可変引数テンプレート

前回の template<class T> void hoge(T&& x){ std::forward<T>(x); } universal referenceを使うことで、右辺値参照も左辺値参照もどちらも入ってくる std::forwardを使うことで、右辺値参照の場合は ムーブコンストラクタ、左辺値参照の場合は コピーコンストラクタ が</t></class>…

クラスのコンストラクタを可変長テンプレートにして ごにょごにょ

C++

前回なやんだ続きではあります 関数テンプレートは暗黙的インスタンス化可能だが、クラステンプレートは不可能 ならば コンストラクタを可変長テンプレートすればいいじゃない [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ #include<iostream> #include<sstream> using namespace std; struct</sstream></iostream>…

関数テンプレートは暗黙的インスタンス化できる

C++

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ で終わりなんだけど、少し悩んでやっぱ無理そうだったのでメモ 関数テンプレートで実装出来るのだが、使い勝手や最適化など考えて 関数オブジェクトにしたかったが 関数とクラスの テンプレートの違いで出来なかった 追記:や…

右辺値参照~完全転送まで100%理解するぞ! part6 Universal Referenceと std::forward

やっと UniversalReferenceですよ! その前に復習 右辺値参照を引数にする時は あまり気にせず下記のようにするのが正しいのでしたね #include <iostream> using namespace std; class X{ public: // explicit付けられない! X(X& x){ cout << "copy" << endl; } X(X&&</iostream>…

右辺値参照~完全転送まで100%理解するぞ! part5 参照の圧縮(reference collapsing)

右辺値参照の山場の一つ Universal Referenceまであと一歩 参照の圧縮とは UniversalReferenceそのものだが 参照は(const等のストレージクラス除き)2種類しかない X& (左辺値参照)、X&&(右辺値参照) X&&& 等はエラーですし X& && 等、参照を重ねる事は出来…

右辺値参照~完全転送まで100%理解するぞ! part4 Universal Reference その前に

こうやって 人に見せようと書く事は自分の理解になる 復習DEATH 前回の復習。右辺値参照を関数の引数にするには 一見コピーに見えるが void hoge( X x ) とプロトタイプすればよい 呼び出し側で hoge( std::move(x) ) とすればムーブコンストラクタが使われ…

右辺値参照~完全転送まで100%理解するぞ! part3 関数呼び出し

いまいちまだ 納得していない部分もある(理解不足 実践的な関数呼び出し 右辺値参照はムーブセマンティクスのために使われる ムーブセマンティクスは主に ・ 所有権の移動 ・ コピーのコストを削減(ポインタのすげ替え) で使われる 所有権の移動 コピーさ…