1 名前:デフォルトの名無しさん (ワッチョイ f37a-QmV0) mailto:sage [2017/03/31(金) 08:47:49.65 ID:UkLjKqcm0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part129 echo.2ch.net/test/read.cgi/tech/1483940967/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.100【環境依存OK】 echo.2ch.net/test/read.cgi/tech/1478440682/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
151 名前:デフォルトの名無しさん (ワッチョイ 1fcc-35Q+) mailto:sage [2017/04/16(日) 15:31:42.38 ID:Jwa8aGsr0.net] dynamic_cast と reinterpret_cast が本来の意味と逆だよな
152 名前:デフォルトの名無しさん (ワッチョイ bbf4-aC3X) mailto:sage [2017/04/16(日) 22:20:05.54 ID:FhXvPItE0.net] 複数インターフェース継承してdynamic_castすればいいところを、基底で取り敢えず全インターフェース重ねてなにもしない実装を定義するみたいなことが多すぎる。
153 名前:デフォルトの名無しさん (オッペケ Sr6f-xkGs) mailto:sage [2017/04/16(日) 22:47:27.74 ID:kL6yOSUfr.net] >dynamic_cast と reinterpret_cast が本来の意味と逆だよな 訳:ボクは言語障害です
154 名前:デフォルトの名無しさん (ワッチョイ 9f78-T+tu) [2017/04/17(月) 02:47:11.79 ID:/ZxvtgP60.net] >>150 いや、それもなんかおかしいだろ。
155 名前:デフォルトの名無しさん (ワッチョイ 6b3c-cQmk) mailto:sage [2017/04/17(月) 03:21:23.30 ID:GWeDXk7n0.net] 抽象から具体へのキャストって何かもやもやする SOLID原則のDIPに反するんじゃないかって気もするし
156 名前:デフォルトの名無しさん (ワッチョイ eb92-D+C1) [2017/04/17(月) 07:06:11.59 ID:D/VW2xRY0.net] 昔風の継承モデルは最近使わなくなったなあ テンプレートの方が融通性高い
157 名前:デフォルトの名無しさん (ワッチョイ 1fcc-35Q+) mailto:sage [2017/04/17(月) 07:43:02.51 ID:H8Au7WAd0.net] は?バカじゃねぇの
158 名前:デフォルトの名無しさん (ワッチョイ 9fc3-hp0W) mailto:sage [2017/04/17(月) 07:48:02.60 ID:4nIA4vL50.net] はい
159 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/17(月) 08:36:25.34 ID:R62eo4r30.net] dynamic_castするよりはそいつが該当するinterfaceを持ってるか確認するほうがマシだと思う struct scroll_interface{ virtual bool down(float value)=0; virtual bool up(float value)=0; }; struct view{ virtual scroll_interface* scrollable(){return 0;} }; struct list_view : view{ virtual scroll_interface* scrollable(){return ptr;} }; if(auto sc = view->scrollable()){ sc->down(1); } みたいな感じ
160 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/17(月) 08:50:40.08 ID:bqYXNS3A0.net] 非メンバ関数にできるものはvariant使った方がいいなって感じになってきた
161 名前:デフォルトの名無しさん (スップ Sd3f-a7Ro) mailto:sage [2017/04/17(月) 08:54:59.22 ID:OwDSFehNd.net] >>157 なんかやだ
162 名前:デフォルトの名無しさん (ワッチョイ 3b37-T+tu) [2017/04/17(月) 08:55:54.12 ID:5RBrgFiu0.net] >>157 いや、それdynamic_castと寸分違わず同じだから… gotoをdo{}while()にするのと同じレベルだと思う。
163 名前:デフォルトの名無しさん (スプッッ Sd3f-lyFy) [2017/04/17(月) 09:07:38.99 ID:qMcNcEsbd.net] RTTIはオプションで切っておきたい
164 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/17(月) 09:13:50.45 ID:R62eo4r30.net] >>160 継承関係になくていいというところが違うし(結構大事だと思う)、dynamic_castはダイナミックリンクするライブラリと組み合わせると面倒くさいからなるべく使いたくないんだよね。
165 名前:デフォルトの名無しさん (スップ Sd3f-a7Ro) mailto:sage [2017/04/17(月) 10:32:14.53 ID:OwDSFehNd.net] 依存関係の強さは変わらんよね
166 名前:デフォルトの名無しさん (ワッチョイ 1f6b-HE/W) mailto:sage [2017/04/17(月) 12:22:18.70 ID:PEkyQsSL0.net] その「強さ」を具体的に数値化できればな
167 名前:デフォルトの名無しさん (ワッチョイ 2bf4-EaKP) [2017/04/17(月) 14:44:09.70 ID:YxhJnxLO
] [ここ壊れてます]
168 名前:0.net mailto: >>157 スクロールできないクラスの中にscroll_interface*を返す関数があってnullptrを返すのか その論法では絶対にあり得ない機能への問い合わせ関数を膨大な数抱え込むここになるぞ [] [ここ壊れてます]
169 名前:デフォルトの名無しさん (ワッチョイ 2bf4-EaKP) [2017/04/17(月) 14:46:29.60 ID:YxhJnxLO0.net] >>162 継承を使わないインターフェイスは確かに欲しいが 後半が何を言っているのか好意的に読んでもわからんぞ
170 名前:デフォルトの名無しさん (スップ Sd3f-a7Ro) mailto:sage [2017/04/17(月) 16:34:39.13 ID:OwDSFehNd.net] QueryInterfaceいやだ
171 名前:デフォルトの名無しさん (ワッチョイ eb00-AM0K) [2017/04/17(月) 16:58:00.17 ID:rD3LHvJv0.net] COM設計したやつって基地外だよな
172 名前:デフォルトの名無しさん (ワッチョイ 2bf4-EaKP) [2017/04/17(月) 18:04:25.63 ID:YxhJnxLO0.net] APIが単一空間に際限なく増えることへの危機感から 何らか対策を講じるとして、割とまともな答えだと思う
173 名前:デフォルトの名無しさん (ワッチョイ 2bf4-EaKP) [2017/04/17(月) 18:05:14.09 ID:YxhJnxLO0.net] GUIDの扱い方が変態的なのがちょっとイヤだけどね
174 名前:デフォルトの名無しさん (ワッチョイ eb59-0/8P) mailto:sage [2017/04/17(月) 22:27:32.59 ID:ZfEceRxS0.net] やっぱこれからはAPIが呼び出し元のコードを生成すべき
175 名前:デフォルトの名無しさん (ブーイモ MMaf-YOru) mailto:sage [2017/04/17(月) 22:40:09.29 ID:KscfyyhaM.net] 呼び出し元のコードは誰が呼び出すんだ
176 名前:片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd3f-L+dC) mailto:sage [2017/04/17(月) 22:43:06.49 ID:dVaQYL/0d.net] オバマ元大統領が電話で呼び出してくれるだろう。
177 名前:デフォルトの名無しさん (ワッチョイ 6b3c-cQmk) mailto:sage [2017/04/18(火) 00:19:12.10 ID:3dyURfCV0.net] そうなんだ、すごいね
178 名前:デフォルトの名無しさん (ワッチョイ 1fcc-35Q+) mailto:sage [2017/04/18(火) 04:24:36.93 ID:sGHQhIiJ0.net] _人人人人人人人人人人人人人人人_ > そうなんだ、すごいね! < ´ ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄ __、、=--、、 __ / ・ ゙! /・ `ヽ | ・ __,ノ (_ ・ | ヽ、 (三,、, _) / /ー-=-i'' (____,,,.ノ |__,,/ |__ゝ 〉 ) ( )
179 名前:デフォルトの名無しさん (ワッチョイ db65-EaKP) [2017/04/18(火) 14:33:19.90 ID:opmIphTi0.net] >>171 APIが関数ではなくテンプレートであるべきということか?
180 名前:ich1 (アウアウオー Sabf-d3ae) [2017/04/18(火) 14:56:55.08 ID:ZJShoz7Oa.net] https://goo.gl/Y4tSAe これは嘘でしょ?本当?
181 名前:デフォルトの名無しさん (ワッチョイ db65-EaKP) [2017/04/18(火) 15:43:43.41 ID:opmIphTi0.net] >>177 スレ違い「生理前の肌荒れナントカ」
182 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 00:24:26.42 ID:37YtuUfA0.net] テンプレートに演算子を与えたいのだけど、マクロでやらないとダメよね? maxとかminとか。 走査するところは共通で、> か < かが違うだけなのだけど。
183 名前:デフォルトの名無しさん (ササクッテロレ Sp6f-cQmk) mailto:sage [2017/04/19(水) 00:50:34.43 ID:5KqdfKh3p.net] 比較用のファンクタをテンプレートパラメータにすれば良いだけじゃないの STLのmapみたいな感じで
184 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 01:36:15.55 ID:37YtuUfA0.net] >>180 なるほどそれなら確かに書けるね。 しかし、ちゃんとインラインにしてくれるのかすごく心配だ。
185 名前:デフォルトの名無しさん (ワッチョイ efa6-HE/W) mailto:sage [2017/04/19(水) 06:48:25.24 ID:1gRwKhTB0.net] よく話が通じるな
186 名前:デフォルトの名無しさん (ワッチョイ 1fcc-35Q+) mailto:sage [2017/04/19(水) 07:02:34.69 ID:pPK7kNhi0.net] トーシローの考えることなど手に取るように解るだろ
187 名前:デフォルトの名無しさん (ワッチョイ 9fc3-hp0W) mailto:sage [2017/04/19(水) 07:45:25.15 ID:CHQbSNlI0.net] ファンクタってなに?
188 名前:デフォルトの名無しさん (ワッチョイ 2b51-EaKP) [2017/04/19(水) 07:58:24.39 ID:NVOSG7Tn0.net] メンバoperator()を持つクラスのインスタンス
189 名前:デフォルトの名無しさん (オッペケ Sr6f-xkGs) mailto:sage [2017/04/19(水) 08:01:07.84 ID:2ep/ROmVr.net] というのが185の妄想
190 名前:デフォルトの名無しさん (ドコグロ MMbf-RLAq) mailto:sage [2017/04/19(水) 08:10:11.76 ID:CJSzniGcM.net] >>181 なぜ試さない?
191 名前:デフォルトの名無しさん (ワッチョイ 2b51-EaKP) [2017/04/19(水) 08:29:27.36 ID:NVOSG7Tn0.net] という妄想を朝から垂れ流す186
192 名前:デフォルトの名無しさん (ワッチョイ 0b6a-T+tu) [2017/04/19(水) 09:06:44.93 ID:oJjBFOoS0.net] >>181 templateとファンクタはインライン展開がかなり期待できる手法。
193 名前:デフォルトの名無しさん (ワッチョイ 1f72-8aNn) mailto:sage [2017/04/19(水) 10:21:17.52 ID:TnomPWtQ0.net] #include "A.h" と class A; の違いって何でしょうか? どのように使い分けるのですか?
194 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 10:26:39.57 ID:37YtuUfA0.net] >>187 ,189 確かに以前違うところで思いっきりインラインされているのを見たから、 実際にはされるのだろうね。 ただ、C++のそういった方向への進化はちょっと嫌いだね。 今現在マクロで書いてるからテンプレートが改行無しのコードになってる。 使い勝手は悪いけど、確実に動くし、インラインだ。 俺の要求としては「テンプレートに演算子を書かせてくれ」これだけだ。 さてC++は何故かこれができない。 とは言え珍しいケースでもないはずだから、実際にはやり方があるはず。 そして聞いてみると、型を作る為にファンクタを作って差し込めばいいと言う。 わざわざ型を作ってコンパイラがインライン化するのを期待しろ? そりゃ動作だけなら同じだが、ソースが余計に見にくくなる。 今の改行無しのコードと、どっちがマシかと言えば、min/max位なら前者だよ。 だからこれなら今回は見送りだ。 とは言え、巨大なテンプレートになってブレークポインタがないと辛い状況になると、 これまではコピペしてデバッグして上書き、というのをやってた。 これは無駄だなあと思っていたので、 とにかくやり方があるのを教えてもらったのはありがたい。 ただ、この解を一般的に受け付けるC++のコミュニティのノリは俺はちょっと嫌い。 重ねて言うが、普通に演算子書かせてくれよ、と思う。
195 名前:デフォルトの名無しさん (スプッッ Sd3f-lyFy) [2017/04/19(水) 10:30:32.85 ID:cmg5eKJnd.net] マクロなんてアホみたいな機能使ってる奴がいまだにいたとは
196 名前:デフォルトの名無しさん (スップ Sd3f-a7Ro) mailto:sage [2017/04/19(水) 10:38:16.72 ID:xWugx3VWd.net] ああ、std::plus とかラムダ式じゃなくて + を指定したいって意味か
197 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 11:18:27.22 ID:37YtuUfA0.net] おー、そういうのがあるんだね。 なるほどそれなら std::rel_ops::operator> を使うべきなのかな? これが標準なら慣れるしかないけど、何だかなー。 呼び出し時に somefunc<double,std::rel_ops::operator>> だとminなのかmaxなのか分からない。 今は関数名もsome_max, some_minとかに出来てるんだよね。
198 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 11:29:39.03 ID:37YtuUfA0.net] ちなみに現状はこんなコード #define FUNC(fname,op) \ template<class T> static T fname(T* ptr, int num){\ T max = *ptr;\ int idx = 1;\ while (idx<num) {\ if (max op ptr[idx]) max = ptr[idx];\ idx++;\ }\ return max;\ } FUNC(max,<) FUNC(min,>) #undef FUNC
199 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/19(水) 12:34:12.22 ID:q88wQIwA0.net] std::max_element お前どこかのスレでbindが遅いとか、質問に答えた相手をアホ呼ばわりしたやつじゃね?
200 名前:デフォルトの名無しさん (ドコグロ MMbf-RLAq) mailto:sage [2017/04/19(水) 12:41:12.49 ID:CJSzniGcM.net] >>192 爺なんだろ 関わりあるならともかくないなら放置でいいよ 下手に絡むとマクロの素晴らしさとかをとうとうと語りそうだし
201 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 12:46:19.25 ID:37YtuUfA0.net] >>196 いや、イテレータが欲しい訳じゃない。 上記の例はそれだが、実際はもっと複雑で、最初に言ったように、 走査部分は全く同じで演算子だけ異なる場合、どうするか。 で、どのレスのこと?
202 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 12:50:36.22 ID:37YtuUfA0.net] ちなみにマクロは糞だと思うぞ。 単純置換くらいならいいが、それ以上は訳が分からなくなる。 ただ、演算子を置換したい為にファンクタにしてテンプレートに突っ込むのも同様に糞だと思うぞ。 見て分かりやすいものではないだろ。
203 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/19(水) 13:00:01.75 ID:q88wQIwA0.net] >>199 お前は中でファンクターを渡す好きな名前のラッパー関数を定義するという発想もないの? まさか関数呼び出しコストガーとか言わないよね?
204 名前:デフォルトの名無しさん (ワッチョイ ef14-AM0K) mailto:sage [2017/04/19(水) 13:04:45.97 ID:Z8YDH0nj0.net] struct Maxf{ template <typename T>static const T f(const T& a, const T& b){return a>b?a:b;} }; struct Minf{ template <typename T>static const T f(const T& a, const T& b){return a<b?a:b;} }; template<class M,typename T >struct Func { static const T f(const T* p, int n) { T m = p[0]; for(int i = 1 ; i < n ; i++){ m = M::f(m,p[i]);} return m; } }; double a[]={-2,3.14,2.2369,0.}; double maxv = Func<Maxf>::f(a, sizeof(a)/sizeof(a[0]) ); 書いといてなんだが、見やすい見にくいの問題なら個人の感想なので好きなようにどうぞとしか
205 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 13:19:37.56 ID:37YtuUfA0.net] >>201 ああなるほど、サンクス。そうすれば外側に名前が見えるのね。 個人的にはちょっと技巧的すぎて嫌いなコードだが、 正直なところ、コピペしてデバッグしてコピペで戻すのもうんざりしてたので、 徐々に慣らしながら使わせてもらうことにするよ。 C++での割と標準的な解決法ってこれなんだよね? みんながやってるのなら俺も慣れるしかない。
206 名前:デフォルトの名無しさん (ワッチョイ 0b75-93S+) mailto:sage [2017/04/19(水) 13:32:04.24 ID:q88wQIwA0.net] >>202 >>201 はまったく標準的ではない。 そんな書き方させる標準ライブラリが一つでもあるか? ideone.com/DLaG5f これだけの話(わざとmin_elementは使わずに書いてる) std::max_elementと関数名は勝手に置き換えろ
207 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 14:06:14.80 ID:37YtuUfA0.net] >>203 いやだからイテレータが欲しいんじゃないんだよ。 それって話が余計に膨らんじゃうだろ。 今既に走査するコードはあって、それをテンプレートで置き換えようとしている。 呼んだら結果が返ってくる、それだけの関数なんだよ。 そのマクロを撲滅しようとしている。 イテレータだと外側コンテナに色々付け足しが必要になる。 それをやりたい訳じゃない。 最初から全て標準コンテナを使え、というのならその通りだが、それは別件だ。 今は生配列なんだよ。 とりあえず「型」としてファンクタなり構造体をテンプレートに渡し、 中でそれを使う、というのが一般的で良いんだよな? それとは別に、走査する部分はイテレータで統一し、 std::max_element等にそれを呼ばせるというのも一つのやり方だよ。 ただこれは今やりたい話じゃない。 つか、イテレータイテレータ言ってるのはJavaだと思っていたが、 C++もイテレータ全盛の世界なのか?
208 名前:デフォルトの名無しさん (ワッチョイ 0b75-93S+) [2017/04/19(水) 14:19:56.81 ID:q88wQIwA0.net] >>204 int a[8]={4,-2,4,56,7,8,5,3}; が生配列に見えないの? const T* a,size_t s が生ポインタと要素数って解らなかった? C++どころかC言語すら解ってないんじゃないの? お前の頭には応用という言葉が無いの? ideone.com/i2h96y
209 名前:デフォルトの名無しさん (ワンミングク MM3f-ZHy1) mailto:sage [2017/04/19(水) 14:25:44.80 ID:15mBJgd3M.net] イテレータってお前の言ってる走査のシンタックスシュガーやぞ
210 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 14:36:42.93 ID:37YtuUfA0.net] >>205 あーなるほど分かったわ。確かにこれの方が直感的で良いわ。 事実として俺はテンプレートに慣れてないからね。 まあとにかくありがとう。
211 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 16:00:45.80 ID:37YtuUfA0.net] すまんが次の質問。 テンプレート内部で型を決めうちしたいのだが、この書き方ってある? 例えば内部で高精度で演算したい時、引数型が 引数double -> 内部double 引数float -> 内部double 引数short -> 内部int64 とか。引数型に対して内部型は確定的に決まる。 今は template<typename T, typename Ti> double somefunc(T* src0, T* src1, int t){} で引数型 T、内部型 Ti としてる。 ただ、これだといちいち呼び出し時に書かないといけない。 単発なのは我慢していたのだけど、リファクタを進めていくと、 上位関数が template<typename T> で済んでいるのに、内部関数が Ti を必要とするから 上位関数も template<typename T, typename Ti> となりだしてちょっとウザくなってきてる。 Ti を何とかして潰せれば呼び出し時にも書かなくて良くなり、全てすっきりするのだが。
212 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 16:07:17.99 ID:37YtuUfA0.net] すまん、ググったら条件分岐がヒットした。 というか2段重ねれば良いだけか?という気がしてきた。 あまり自信はないが。
213 名前:デフォルトの名無しさん (ワンミングク MM3f-ZHy1) mailto:sage [2017/04/19(水) 16:15:43.91 ID:15mBJgd3M.net] type_traits使う
214 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 16:30:01.80 ID:37YtuUfA0.net] >>210 > type_traits 見た目それようだが、何故かサイズが取れないのね。 ただどのみち俺の環境(VS2008)では使えないようだ。 とはいえ、今回の質問はどうやらラップすれば終わりのようだ。 お騒がせして申し訳ない。
215 名前:デフォルトの名無しさん (ワッチョイ 0b75-93S+) [2017/04/19(水) 16:39:33.18 ID:q88wQIwA0.net] >>209 色々方法あるけど *1 単純にオーバーロードを重ねる template<typename T, typename Ti> double somefunc_impl(T* src0, T* src1, int t){} double somefunc(float* src0, float* src1, int t){ return somefunc_impl<float,double>(src0,src1,t); } double somefunc(short* src0, short* src1, int t){ return somefunc_impl<short,int64 >(src0,src1,t); } double somefunc(double* src0, double* src1, int t){ return somefunc_impl<double,double>(src0,src1,t); } *2 trait (somefunc_internal_typeを定義していない型だけ渡すとコンパイルエラー) template<typename T>struct somefunc_internal_type{}; template<>struct somefunc_internal_type<float>{ using type = double; }; template<>struct somefunc_internal_type<double>{ using type = double; }; template<>struct somefunc_internal_type<short>{ using type = int64_t; }; template<typename T, typename Ti = somefunc_internal_type<T>::type> double somefunc(T* src0, T* src1, int t){} 規則性があるならtraitsはenable_ifとかで少なく書けるが、深入りするとC++の闇にのまれるからおすすめしない using type = double; を typedef double type; に変えたらたぶんVS2008でも使える
216 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 16:54:59.37 ID:37YtuUfA0.net] >>212 ありがとう。まさに今その1をやったところ。 地味だがこれが一番分かりやすい。 ラップしまくるのは気になるが、C++の世界だとコンパイラが最適化してくれることを期待するんだよな? traitは後日試してみるわ。本来はそっちの方が本筋なのだろうし。 今回は精度最高型で演算するだけだから規則は簡単。 char, short, int -> int64 float, double -> double だね。
217 名前:デフォルトの名無しさん (ワッチョイ 0f92-D+C1) mailto:sage [2017/04/19(水) 17:05:51.26 ID:zKKKUYsP0.net] >>209 俺もパッと思いつくのはenable_if使って2段にすることだな こんな風に https://ideone.com/5VIuuw もっとスマートなやりかたがあったら教えて欲しい
218 名前:デフォルトの名無しさん (ワッチョイ 6b3c-V7Gz) mailto:sage [2017/04/19(水) 19:31:59.93 ID:suSDkWlT0.net] >>213 >コンパイラが最適化してくれることを期待するんだよな? まず試せw VCで逆アセンブル見るなり https://gcc.godbolt.org/# ↑これで見るなり 厳密には知らんが、関数テンプレートは大体inlineつけなくても最適化でインライン展開の対象になる
219 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 19:52:27.59 ID:37YtuUfA0.net] >>215 まあそうなんだけど、今回については ・仮に遅くなったとしてもやる ・最終的にはアセンブラに差し替える という、主に編集上の都合なのでどの道やるんだわ。 最悪、手でコピペして展開すれば直結出来ると分かっているから、その辺は安心。 テンプレート慣れしてないから、いちいちラップするのが気持ち悪いが、 そんなもんだというのなら慣れるしかない。 ただやっぱ、見た目直感的なコードではなくなるのが残念なところ。 varにしたら自動的にテンプレートになって、 文句がある場合のみ手動で特殊化が一番助かるんだが。
220 名前:デフォルトの名無しさん (ワンミングク MM3f-ZHy1) mailto:sage [2017/04/19(水) 21:04:11.42 ID:15mBJgd3M.net] >>216 >varにしたら自動的にテンプレートになって、 >文句がある場合のみ手動で特殊化が一番助かるんだが。 いやそれがtraitsなんだけど…
221 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 21:47:13.23 ID:37YtuUfA0.net] >>217 いやあれ属性でやろうとしてるでしょ。 普通に型名で書いた方が楽だよね。特殊化みたいに。 変に汎用化させようとして、余計に分かりにくくなってるよ。 なんつーか、C++ってそっちの傾向あるでしょ。変に技巧に凝りすぎというか。 テンプレートにしても、編集上の努力であって、新機能追加やバグ取りにはならないし。 努力の方向を間違えたら完全に空回りてしまう。 varで書かせてくれよとマジで思うよ。
222 名前:デフォルトの名無しさん (ワンミングク MM3f-ZHy1) mailto:sage [2017/04/19(水) 22:18:24.03 ID:15mBJgd3M.net] varと書けるようにするとなぜ新機能開発やバグ取りにできるの?? templateで何ができないと言ってるのかまじで意味わからん templateをマクロと同じように使おうとしかしてないから編集上の機能に見えるだけでしょ? ランタイムのオーバーヘッドをなくすために使うんだよ普通は てか属性でやろうとしてるってなんだよ、現行C++にattributeなんてねーよクソカス 高精度型にキャストしたいならtraitsとdispatch用の関数書くだけ
223 名前:デフォルトの名無しさん (ワッチョイ 6b3c-V7Gz) mailto:sage [2017/04/19(水) 22:29:39.45 ID:suSDkWlT0.net] >>218 言いたいことはわからんでもないけどな 他人はどうか知らんが、自分はSTLやboostのコードを分かりやすいとは全く思わん ヘッダで公開してるから(そうせざるを得ないんだが)アレを全員目指すべきと勘違いしてる人はいるかもしれんw 言ってしまえば、テンプレートで設計の幅広げたり高速化したり、ってのはあくまで副産物的に生まれたトリックに過ぎんし そういうライブラリはきちんとドキュメントが存在しないと使い物にならん(あれば超便利なんだが) そもそもほぼC++しかやってないのでvarが何なのかよーわからんが。 関数型言語みたいな記述力を求めてんのかね?
224 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 22:39:24.29 ID:37YtuUfA0.net] >>219 templateを使わずに同じ事を実現出来る環境なら、 その時間を新機能追加やバグ取りに使えるって事だよ。 実際、JavaScriptとかはそうなんだよ。 ただし、あっちには別の問題があるのだけどね。
225 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/19(水) 22:50:14.02 ID:q88wQIwA0.net] でたJavascript やっぱりstd::bindは高機能すぎるからオーバーヘッドが有るとか言ってた奴か。
226 名前:デフォルトの名無しさん (ワッチョイ bb1f-ZHy1) mailto:sage [2017/04/19(水) 22:52:18.87 ID:1eYI3Ipd0.net] あーあいつか あの時も意味不明なこといいまくってたな… もうC++は諦めろ
227 名前:デフォルトの名無しさん (ワッチョイ 6b3c-V7Gz) mailto:sage [2017/04/19(水) 22:54:45.80 ID:suSDkWlT0.net] >やっぱりstd::bindは高機能すぎるからオーバーヘッドが有るとか言ってた奴か これがマジなら >ID:37YtuUfA0 マジで実測する癖つけた方がいいよ・・・・・w 速度に関して憶測でモノ言うのは話にならん・・・・
228 名前:デフォルトの名無しさん (ササクッテロレ Sp6f-cQmk) mailto:sage [2017/04/19(水) 22:56:23.35 ID:5KqdfKh3p.net] 常軌を逸してる 触ってしまってすみませんでした
229 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 22:57:53.67 ID:37YtuUfA0.net] >>220 varは何でも突っ込める。(というより型がない) 理論的には、全ての変数を「別々に」テンプレート化しているのと同じ事になる。 だから、理論的にJavaScriptにはテンプレートが必要ない。 (あるけどあれはHTML生成用の別物であって、C++のテンプレートとは違う) 例えば、maxがあったとして、 C++: double max (double x, double y){ return (x>y)? x : y;} JavaScript function max(x,y){ return (x>y)? x : y;} なんだけど、これはC++的には template <typename Tx, typename Ty, typename Tr> Tr max(Tx x, Ty y){ return (x>y)? x : y;} と同じ意味になる。 こんなデタラメで良いのか?と思うけど、 実際、コードの大半はデタラメで良いから、 常に完全フルチューンマニュアル走行のC++はオーバースペックなんだよね。 手抜きで良いところはもっと手抜きしたい。 テンプレートは道路整備に近いから、ライブラリを作っている人はガンガン使うべきだけど、 それぞれの単独アプリで濫用すると空回り感が酷い。 とは言え、それを理由にデタラメにやってきたからいよいよ見にくくなってリファクタしてるんだけど。 ちなみに関数型(キリッの連中は多分勘違いしている。関数型が既述能力が特に高いわけではない。 というか、C++で出来ない既述は基本的にないと思う。 ただし、書きやすいかと言われれば、全く酷いけど、C++のコミュニティってかなり厨二で、 そういうのもC++の魅力だ!と言いきっている感がある。 いや勘弁してください、ってことで。
230 名前:デフォルトの名無しさん (ワッチョイ 6bc8-HE/W) mailto:sage [2017/04/19(水) 23:05:48.45 ID:37YtuUfA0.net] >>224 コンパイラが最適化してくれるからいい、のではなくて、 コンパイラが最適化しなくても速いコードを最初から書こうとしているって事だよ。 ただしC++ではそれが出来ないが、 そもそもコンパイラが最適化してくれるから問題ないってノリでしょ。 ここら辺はスタイルの違いだと思うよ。
231 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/19(水) 23:07:23.43 ID:q88wQIwA0.net] >>224 俺も憶測で決めつけてるけどね。 でもこの書きっぷりと応用性のなさ。Javascriptときたからもうあいつにしか見えない。
232 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/19(水) 23:11:15.73 ID:cDK+jlin0.net] 何故気に入らないのにC++を使おうとするんだ RustとかSwiftのような新しい言語の方がきれいに安全に書けるぞ
233 名前:デフォルトの名無しさん (ワンミングク MM3f-ZHy1) mailto:sage [2017/04/19(水) 23:12:32.75 ID:9cOcPQsOM.net] template <typename T> T max(T a, T b) { return x > y ? x : y; } だろ?馬鹿? しかもjavascriptのvariant型なんてc++でいうとこのvoid*型だろ? 使うたびに内部ではdowncastしてるはずなのにそのオーバーヘッドコストは気にならないのか?
234 名前:デフォルトの名無しさん (ワッチョイ bb1f-ZHy1) mailto:sage [2017/04/19(水) 23:14:03.78 ID:1eYI3Ipd0.net] >>229 RustもSwiftも強い静的型付けだから、型システムがわかってないこいつにはC++同様使えない
235 名前:デフォルトの名無しさん (ワッチョイ efa6-HE/W) mailto:sage [2017/04/19(水) 23:28:44.31 ID:1gRwKhTB0.net] テンプレートだと指が勝手にユニバーサル参照にしてしまう
236 名前:デフォルトの名無しさん (オッペケ Sr6f-xkGs) mailto:sage [2017/04/19(水) 23:53:27.98 ID:5Pu3YB5qr.net] >>219 >現行C++にattributeなんてねーよ 何故か規格を読まない奴ほど自信満々に嘘をつく法則
237 名前:デフォルトの名無しさん (オッペケ Sr23-bEgw) mailto:sage [2017/04/20(木) 00:12:38.85 ID:tHs+CIU3r.net] >template <typename T> T max(T a, T b) { return x > y ? x : y; } >だろ?馬鹿? >>226 の説明が理解できなかった自分の方が馬鹿だった という事実に230が気付くことは無いだろう
238 名前:デフォルトの名無しさん (ワントンキン MMfa-kezb) mailto:sage [2017/04/20(木) 00:17:15.41 ID:4toBdd3vM.net] いやお前だよ…
239 名前:デフォルトの名無しさん (ワッチョイ 1f8f-AhUp) [2017/04/20(木) 05:55:38.33 ID:dzDslOc/0.net] js訛りのC++か 気がつくとぼっちだぜ んなキモいことしてっと
240 名前:デフォルトの名無しさん (ワッチョイ 871f-HDOw) mailto:sage [2017/04/20(木) 06:46:57.40 ID:4gdppVlz0.net] そういやC++のきれいなコードあんまり見たことない
241 名前:デフォルトの名無しさん (スップ Sd4a-Vs57) mailto:sage [2017/04/20(木) 12:06:51.73 ID:nHxDShTLd.net] 俺のコードはスカスカで綺麗だぜ!
242 名前: ̄ ̄\| ̄ ̄ ̄ ̄ ̄ ̄ ̄ (ワッチョイ 8acc-C5/3) mailto:sage [2017/04/20(木) 16:31:13.15 ID:dSLwtaqZ0.net] ,,-―--、 |:::::::::::::;;;ノ |::::::::::( 」 ノノノ ヽ_l ,,-┴―┴- 、 ∩_ /,|┌-[]─┐| \ ( ノ / ヽ| | バ | '、/\ / / / `./| | カ | |\ / \ ヽ| lゝ | | \__/ \ |  ̄ ̄ ̄ | ⊂|______| |l_l i l_l | | ┬ |
243 名前:デフォルトの名無しさん (ワッチョイ de92-UbXF) mailto:sage [2017/04/20(木) 16:39:26.78 ID:pGeg/NAi0.net] 俺のコードにはファウンデーションを丹念に塗ってある
244 名前:デフォルトの名無しさん (オッペケ Sr23-bEgw) mailto:sage [2017/04/20(木) 21:34:46.16 ID:iTkbXITvr.net] >>232 ユニバーサル参照にするとどういう制限が発生するのか分かった上でやっているのか?
245 名前:デフォルトの名無しさん (ワッチョイ 87f4-bQlo) mailto:sage [2017/04/20(木) 21:45:04.01 ID:OBF/5/VT0.net] >>240 MFCとか綺麗だよねw
246 名前:デフォルトの名無しさん (ワッチョイ 06a6-HDOw) mailto:sage [2017/04/20(木) 22:40:39.82 ID:16AwdhdC0.net] >>241 はて?制限・・・そんなのあったっけ? (あわててEMC++をめくりながら)
247 名前:デフォルトの名無しさん (オッペケ Sr23-bEgw) mailto:sage [2017/04/21(金) 14:01:58.43 ID:jq02h6/Cr.net] Effective Modern C++のItem 30を読まなくても幾つかは日常的に気付きそうなものだが struct A { constexpr static int N = 1'000; }; f_pass_by_value(A::N); // OK f_pass_by_universal_ref(A::N); // NG
248 名前:デフォルトの名無しさん (ワッチョイ a375-OSeR) [2017/04/21(金) 14:33:26.68 ID:SD7KIjS10.net] >>244 それ -std=c++1z で通るのな。規格変わったん?
249 名前:デフォルトの名無しさん (オッペケ Sr23-bEgw) mailto:sage [2017/04/21(金) 14:40:59.59 ID:jq02h6/Cr.net] >>245 変わる予定 流石にC++14の言語仕様はクソだった N4659 D.1山椒
250 名前:デフォルトの名無しさん (オッペケ Sr23-bEgw) mailto:sage [2017/04/21(金) 14:43:15.61 ID:jq02h6/Cr.net] だがこれはC++17でも通らない struct A { int b : 2; }; f_pass_by_ref( A{}.b );
251 名前:デフォルトの名無しさん (スップ Sd4a-Vs57) mailto:sage [2017/04/21(金) 14:47:58.15 ID:uAFMuOM4d.net] クソザコなので日常的には何も気付かない