1 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 23:27:34.48 ] The C++ Standards Committee www.open-std.org/jtc1/sc22/wg21/ Wikipedia ja.wikipedia.org/wiki/C%2B%2B11 前スレ: C++11/C++0x 14 hibari.2ch.net/test/read.cgi/tech/1316760961/
152 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 21:22:35.54 ] >>148 設計の問題か? template<> class Vector<2>; template<> class Vector<3>; 例えば、ベクトルを次元別に特殊化して作ったとき、 外積は2次元3次元で実装変えるけど、 内積は共通のものを使いたいとか普通にあるだろ。
153 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 21:32:25.13 ] あるある というかまさにその例で
154 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 21:45:05.95 ] >>152 メンバ関数単位で特殊化すればそこだけ入れ替わるよ。 template <class T> struct A { int f(){ return 0; } int g(){ return 100; } }; template <> int A<void>::f(){ return 1; } データメンバは同じやり方では特殊化できないけど データメンバまで入れ替わるような特殊化をしたなら 汎用のメンバ関数なんぞ役に立つまい
155 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 21:48:11.20 ] Vector<T, 2> / Vector<T, 3> だとそれ無理
156 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 21:49:56.86 ] >>154 それ処理系依存でしょ。
157 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 21:54:02.38 ] うむ。確かにダルイな 二桁近くのバリエーションに成れば対策講じるけど〜5種くらいならダサいなと思いながらもコピペ
158 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 22:00:55.06 ] >>156 gcc -pedantic でもいけるから、たぶん規格通りのはず。C++11 も関係ない
159 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 22:02:49.02 ] なるほどありがとう。多分当時触ったVCが糞だったんだろう
160 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 22:11:21.56 ] 現状の汎用的な解決策は、異なる関数だけfriendなんだろうが、 オーバーライドはできないし、コンストラクターや デストラクターはどうしようも無いんだよなぁ。
161 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 23:02:31.44 ] >>155 本当だ。部分特殊化はできないのか。
162 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 23:11:37.21 ] Vectorをfloat/double/long double、2/3/4(同次座標)で作りたかった時に 部分特殊化できなくて困った 結局コピペ
163 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 00:50:59.75 ] サイズわかってる行列とその演算はスクリプトで出力する派
164 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 17:36:26.95 ] template<> class Vector<2> : public Vector_base<2>; template<> class Vector<3> : public Vector_base<3>;
165 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 20:20:16.66 ] 結局俺もそれと同じような書き方してるな。 話が変わるが、Dのtypedef structってなんか問題あるの? C++も組み込めばいいのに。
166 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 11:26:56.34 ] プリプロセッサがスクリプト並にリッチになればいいのに
167 名前:デフォルトの名無しさん [2011/12/05(月) 11:32:21.31 ] 俺用メモ Amazon.co.jp: ゲームプログラマのためのC++: マイケル・ディックハイザー, 三宅 陽一郎, 田中 幸, ホジソン ますみ, 松浦 悦子: 本: ttp://www.amazon.co.jp/dp/4797366761 ttp://togetter.com/li/223398 ttp://www.amazon.co.jp/gp/bestsellers/books/754384/
168 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 11:42:24.43 ] そこまで行くとスクリプトとmakeでいいじゃんってなる
169 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 14:08:10.40 ] 初めてのC++11まだ出てないですか?
170 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 14:32:18.49 ] >>169 mayersがPDF売ってるよ
171 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 19:22:23.18 ] >>166-168 げてものでならば C#をプリプロセッサとして使う ― CsPP ttp://labs.yaneu.com/20111002/
172 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 19:33:36.18 ] コードジェネレータ系の欠点はエディタやIDEのサポートがなくなることだよな そこまで自作してメンテナンスする気も起きないし
173 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 02:34:31.08 ] >>170 高橋真奈さんのやつです。
174 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 01:58:58.79 ] まなのC++本はNG入りのはずだが。 C++11対応を仮に書いたとしても期待できない。
175 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 17:54:00.65 ] dynamic_castを言語機能の中に入れてしまったのは間違いだったよね
176 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 20:43:01.12 ] なんでやねん
177 名前:デフォルトの名無しさん [2011/12/12(月) 23:26:37.32 ] それ以外の言語機能でできることを、言語機能とはしないというポリシーはもともとないんだが
178 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:58:52.20 ] プリプロセッサw 自分で書けよw
179 名前:デフォルトの名無しさん mailto:sage [2011/12/15(木) 15:23:10.00 ] int a = 0; int &b = a; int &&c = (int&&)a; int d[2] = {}; int (&e)[2] = d; int (&&f)[2] = (int(&&)[2])d; //error C2440: '初期化中' : 'int [2]' から 'int (&&)[2]' に変換できません。左辺値を右辺値の参照にバインドすることはできません vc10のバグ? c++11の仕様?
180 名前:デフォルトの名無しさん mailto:sage [2011/12/15(木) 19:00:02.91 ] MSVCのバグ。
181 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 09:12:17.10 ] thx
182 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 11:33:37.65 ] バグっていうより古いだけの気がする。 xvalue が登場する前の rvalue reference なんじゃないの? 配列の prvalue って存在しない気がするし。
183 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 20:47:06.63 ] よく考えたら配列の prvalue も存在するな…。 やっぱバグだな。 void f(int (&&a)[1]){ std::printf("%d\n", a[0]); } int main() { struct X { int x[1] = { 10 }; }; f(X().x); }
184 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 22:12:10.31 ] バグバグ言ってる奴 そのVCが出たのいつだと思ってるんだ?
185 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 00:48:41.88 ] β状態だし、期待するだけ無駄だよな。
186 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 07:36:31.43 ] いつかは関係ないよ はなから不完全と言って出してんだから
187 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 12:18:00.95 ] vc11も対応項目あんま増えないらしいし 未実装というより、やる気ないってのが正しい気がする
188 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 22:32:16.26 ] C99と同じ運命を辿りそうだな
189 名前:デフォルトの名無しさん mailto:sage [2011/12/19(月) 22:33:04.84 ] 実装すらされないC99に比べれば まだM$はやる気があるよ
190 名前:デフォルトの名無しさん mailto:sage [2011/12/20(火) 00:20:30.86 ] やる気がないんじゃなくて WinRT対応を優先させただけ
191 名前:デフォルトの名無しさん mailto:sage [2011/12/21(水) 19:11:08.09 ] vector< vector< vector<int> > > unko; C++11ってこれを簡単に書けるようになったんだっけ? もしくは配列にデフォルトのコンストラクタがあってくれればいいんだけど やっぱ無理?
192 名前:デフォルトの名無しさん mailto:sage [2011/12/21(水) 19:35:05.36 ] vector<vector<vector<int>>> unko = { { {1,2,3}, {4,5,6}, {7,8,9} }, { {0,0}, {0}, {} } }; こういうの書きたいの?出来るよ
193 名前:デフォルトの名無しさん mailto:sage [2011/12/21(水) 19:51:48.00 ] int unko[5][5][5]; に比べて長いのをC++11で簡単にかけるようになってないかなと vector<int[5][5]> unko; これでもいいんだけど resizeでコンパイルエラーが出てて 多分int[5][5]();を呼びだそうとしてエラー吐かれてしまうま Marray<vector<int>, 3> unko(5,5,5); みたいの作らないと無理かな
194 名前:デフォルトの名無しさん mailto:sage [2011/12/21(水) 22:06:10.58 ] >>191 template < std::size_t I, std::size_t J, std::size_t K > using Shit = std::array< std::array< std::array<int, K>, J >, I > ; Shit<5, 5, 5> unko ; まあ正直、 template < std::size_t I, std::size_t J, std::size_t K > struct Shit { using type = std::array< std::array< std::array<int, K>, J >, I > ; } ; Shit<5, 5, 5>::type unko ; とあんまり変わんないけどね。
195 名前:デフォルトの名無しさん mailto:sage [2011/12/21(水) 22:12:41.22 ] usingもtemplate使えるんだっけ?
196 名前:デフォルトの名無しさん mailto:sage [2011/12/21(水) 22:21:56.74 ] 可変長テンプレート使えばええがな。 Array< int. std::vector >( 10, 20, 30, 4, ・・・);
197 名前:デフォルトの名無しさん mailto:sage [2011/12/21(水) 23:00:41.98 ] なるほどー参考になったありがと C++03の範囲で作ってみるよ
198 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 01:21:26.33 ] 何でunkoとかshitとかなの?
199 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 11:33:13.21 ] だって美味しいじゃん。
200 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 13:45:09.09 ] <thread>ってないの?
201 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 13:48:21.79 ] threadsならあるよ
202 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 20:21:53.50 ] あるよ
203 名前:デフォルトの名無しさん [2011/12/23(金) 18:11:34.48 ] 『ゲームプログラマのためのC++』発刊2日目のつぶやきまとめ ttp://togetter.com/li/231358 まとめ主は嬉しそうだな
204 名前:デフォルトの名無しさん mailto:sage [2011/12/23(金) 19:26:54.83 ] スレ違いすぎる
205 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 05:04:57.88 ] マック関連の環境では全然受け入れられてないよね linuxとwinでは動くけど
206 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 05:14:17.13 ] >>203 こういう奴のせいでゲーム屋はロリコンばかりだと思われるんだ。 アイコンのコピーライトはクリアできてるんだろうな? 泥棒に宣伝してもらっても嬉しくないだろう。
207 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 05:43:11.03 ] >>206 ttp://www.madoka-magica.com/special/present/movies.html
208 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 07:15:27.47 ] >>206 実際多いからしょうがない
209 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 11:37:15.10 ] アニヲタっぽい話題ふってる人多いと思うよ そして、そんな人の中にスーパーハカーがいたりする C++11 Advent Calendar 2011でも見てみなよ ttp://atnd.org/events/21936
210 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 13:01:09.12 ] 17.6.4.3.5 _ で始まらないユーザー定義リテラルの接尾辞は、予約されている。 17.6.4.3.2 グローバル名前空間では、一つ以上の _ で始まる名前は予約されている。 →つまりユーザー定義リテラルは非グローバルな名前空間で定義しないといけない。 でもユーザー定義リテラルを呼び出すとき、 その名前空間を引数から判断することはできない。 (引数はプリミティブな型だから) どうすればいいの…。
211 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 13:17:33.96 ] using でいけるんちゃうん?
212 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 13:41:30.54 ] operatorも含めて名前でおk
213 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 15:49:51.90 ] >>210 ユーザー定義リテラルの接尾辞は「名前(name)」じゃないので 17.6.4.3.2の制約を受けない ってどっかで結論が出てたような
214 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 17:35:37.87 ] pc12.2ch.net/test/read.cgi/tech/1253280377/15- あたりのはなしだな
215 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 17:44:54.42 ] 0_hoge は operator""_hoge(0) とも呼べるんだよね?
216 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 18:15:34.18 ] >>214 トン。読んできた。 "hage"_x; // ここでは "hage"_x でひとつながりで切り出されるトークン operator"" _x("hage", 4); // ここでは _x は独立したトークン だから、普通に使うとき "hage"_x; は何の問題もない。 問題は定義するときや operator"" _x("hage", 4); という書き方をするときで その場合でも _x は suffix なので、他の名前と衝突していても構わない、ということね。 で、あと問題はプリプロセスのマクロだけど マクロで予約されているのはダブルアンダースコアか、_ + 大文字 だから _ + 小文字 なら置換される可能性はないというわけだ。 なるほど。
217 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 18:22:22.84 ] #define _x a がある時の operator "" _x は "" と _x が離れてるので1つのトークンとは見なされないから operator "" a になるってのでいいの?
218 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 18:38:03.32 ] >>217 13.5.8-8 の第4例に float operator ""E(const char*); // error: ""E (with no intervening space) // is a single token とわざわざ書いてあるので、 operator"" _x の場合 _x は独立したトークンだし、独立したトークンとして書かなければいけない。 だから #define _x a があったら operator"" a になるので正しいはず。
219 名前:デフォルトの名無しさん mailto:sage [2011/12/24(土) 20:19:33.23 ] なるほど
220 名前:デフォルトの名無しさん mailto:sage [2011/12/26(月) 21:52:17.21 ] www.suri.cs.okayama-u.ac.jp/servlets2/scm2cpp.rkt Schme to readable C++ に自動型推論を導入してみました。まだ不具合が沢山あるので1ヶ月後ぐらいに見るといいかも
221 名前:デフォルトの名無しさん [2011/12/27(火) 10:35:01.40 ] Sub<T>からTを取り出すようなtype_traitってないですか? $ cat d.cpp template <class Derived> class Base { typedef typename Derived::type type; }; template <typename T> class Sub: Base<Sub<T>> { typedef T type; }; int main() { Sub<int> s; return 0; } $ g++ -std=c++0x d.cpp d.cpp: In instantiation of ‘Base<Sub<int> >’: d.cpp:7:7: instantiated from ‘Sub<int>’ d.cpp:13:12: instantiated from here d.cpp:3:34: error: no type named ‘type’ in ‘class Sub<int>’
222 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 10:55:20.16 ] typeidでいいんじゃね?
223 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 10:58:39.67 ] template <template <typename> class Derived, typename T> class Base { public: typedef T type; }; template <typename T> class Sub : Base<Sub, T> { }; とかじゃだめ?
224 名前:221 mailto:sage [2011/12/27(火) 11:11:41.30 ] >>222 実行時は嫌かな。 >>223 Boostは引数たくさん与えるアプローチで、それに近い。 けどライブラリ側で頑張って仕事したい感じなんで。
225 名前:221 mailto:sage [2011/12/27(火) 11:13:38.25 ] ttp://stackoverflow.com/questions/6006614/c-static-polymorphism-crtp-and-using-typedefs-from-derived-classes によるとこんな感じ。 メタにやるのは難しいのですかね。 template <typename T> struct trait; template <class Derived> struct Base { typedef typename trait<Derived>::type type; }; template <typename T> struct Sub: Base<Sub<T>> { typedef T type; }; template <typename T> struct trait<Sub<T>> { typedef T type; }; int main() { Sub<int> s; return 0; }
226 名前:デフォルトの名無しさん [2011/12/27(火) 12:16:27.91 ] www.nicovideo.jp/watch/sm16529183
227 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 12:17:06.02 ] //テンプレートでない引数を入れた場合 template<typename T> struct template_trait{ typedef T type; }; //テンプレートを入れた場合 template<template<typename> class temp, typename T> struct template_trait<temp<T>>{ typedef T type; }; template<typename T> struct hoge{}; typedef hoge<int> ihoge; template_trait<ihoge>::type i = 0; こんなかんじ?
228 名前:221 mailto:sage [2011/12/27(火) 13:01:02.76 ] >>227 良い。 こんなのもないのか・・・
229 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 18:37:34.12 ] >>225 > メタにやるのは難しいのですかね。 というかそもそも template <typename T> class Sub: Base<Sub<T>> { // (1) typedef T type; }; Base<Sub<T>>は(1)の時点で定義されるけど その時点ではSub<T>は不完全型でメンバは未定義なんでBaseの中ではSub<T>のメンバに依存するものは定義できない
230 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 18:45:08.64 ] 0xだと無名関数を束縛した変数つかって 関数を定義できるようになるよな。 auto Function = []()->int{ return 0; } Function(); これ応用してクラスの中に書いたとき、 メンバー変数のメンバー関数の委譲に 使えたりはしないんかね。 struct T { D member; auto Function = member.Function; }; T object; object.Function():
231 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 18:51:53.54 ] autoは無理だがstd::functionならいける
232 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 19:19:25.32 ] double a = -0; はIEEE表現で0なのに -a とするとIEEE表現で-0になるバグはどうにかならないのかな ideone.com/m27cn
233 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 19:24:44.83 ] 0 も -0 も int(0) ideone.com/WBvnH
234 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 19:28:02.74 ] メンバー関数とオブジェクトにドット演算子とアロー演算子を適用したときの演算結果って 相変わらず関数呼び出し演算子を呼び出せる何かなんだな。 いいかげん、建前だけでもラムダを返すって事にしてくれりゃいいのに。
235 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 19:39:11.03 ] >>233 なるほど
236 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 19:41:32.47 ] >>234 ラムダが暗黙の関数オブジェクトとして定義されているから循環参照になる。
237 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 19:57:57.35 ] >>236 実装上は問題ないじゃん。 object.Function;// この時点ではラムダ無し auto lambda = object.Function; // 使用されるタイミングで初めてラムダ生成
238 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 23:48:51.06 ] C++「javaが二の足踏んでる間にλ入れちゃったぁ えへっ☆」
239 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 21:15:35.72 ] Javaには本気でほしい機能。あとイテレータの改善も。
240 名前:デフォルトの名無しさん [2012/01/04(水) 22:45:07.44 ] 質問。 ラムダ式って何が便利? 関数ポインタを引数にとる関数のテストには使えるかなと思ったけどそれ以外の使い道があるのか知りたいです。
241 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 22:53:28.31 ] >>240 関係のある処理を近くに書けるところ。 キャプチャーができるところ。
242 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 22:59:40.51 ] 関数作るまでもないような処理を そのままインラインで書ける
243 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 23:53:03.89 ] ・関数オブジェクトのクラス定義を式中に書ける ・そのクラス定義を簡略記法で書ける つまり、ソースの記述の面で書くときに楽になって読むときの可読性があがる。 と、実のところそれだけだけど適切に使えば効果は大きい。
244 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 23:59:34.84 ] ラムダがあるのにforにrange-basedの構文を追加したのは冗長だと思う
245 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 00:21:05.83 ] for(int i : v){ printf("%d",i); } std::for_each(v.begin(),v.end(),[](int i){ printf("%d",i); }) めんどくせーと書こうと思ったけど 書いてみると大して変わらなかった
246 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 00:24:06.31 ] 上の方がすっきりに見える
247 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 00:24:52.48 ] 上で書けた方が格段にいいわ
248 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 00:36:52.36 ] lambdaじゃ引数にauto使えないしな
249 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 02:03:11.46 ] C++のforeachはめんどくさい 範囲指定するのがめんどくさい 引数の型書くのがめんどくさい forとeachの間に_書くのがめんどくさい
250 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 02:04:53.50 ] boost::for_each(v,[](int){ printf("%d",i); }) だと記述量はそんなに変わらんだろう 型推論はもうちょっと真面目にやれと思う
251 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 07:20:28.94 ] 折角std::begin, std::end導入したんだから conceptさん無くてもそういうアルゴリズムが欲しかったな 関数名変わっても良いから
252 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 11:39:18.95 ] concept_mapあればrange-based forがもっと効いてくるのになあ。