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
119 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/10(月) 14:44:01.60 ID:DheowmrF0.net] EXAMPLE 1 int i1 = 1; // definition, external linkage static int i2 = 2; // definition, internal linkage extern int i3 = 3; // definition, external linkage int i4; // tentative definition, external linkage static int i5; // tentative definition, internal linkage int i1; // valid tentative definition, refers to previous int i2; // 6.2.2 renders undefined, linkage disagreement int i3; // valid tentative definition, refers to previous int i4; // valid tentative definition, refers to previous int i5; // 6.2.2 renders undefined, linkage disagreement extern int i1; // refers to pre vious, whose linkage is external extern int i2; // refers to pre vious, whose linkage is internal extern int i3; // refers to pre vious, whose linkage is external extern int i4; // refers to pre vious, whose linkage is external extern int i5; // refers to pre vious, whose linkage is internal EXAMPLE 2 If at the end of the translation unit containing int i[]; the array i still has incomplete type, the implicit initializer causes it to have one element, which is set to zero on program startup.
120 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/10(月) 14:44:21.17 ID:DheowmrF0.net] 6.9.2 外部オブジェクト定義 意味規則 オブジェクトの識別子の宣言がファイル有効範囲及び初期化子をもつ場合,その宣言を識別子の外部定義という。 ファイル有効範囲のオブジェクトの識別子を,初期化子を使わず,かつ,記憶域クラス指定子なしか又は記憶域クラス指定子static で宣言する場合,そのオブジェクトの識別子の宣言を仮定義(tentativedefinition)という。 翻訳単位が,ある識別子に対する仮定義を一つ以上含み,かつその識別子に対する外部定義を含まない場合,その翻訳単位に,翻訳単位の終わりの時点での合成型,及び0 に等しい初期化子をもったその識別子のファイル有効範囲の宣言がある場合と同じ規則で動作する。 オブジェクトに対する識別子の宣言が仮定義であり,内部結合をもつ場合,その宣言の型は不完全型であってはならない。
121 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/10(月) 14:45:14.16 ID:DheowmrF0.net] 例1. int i1 = 1; // 定義,外部結合 static int i2 = 2; // 定義,内部結合 extern int i3 = 3; // 定義,外部結合 int i4; // 仮定義,外部結合 static int i5; // 仮定義,内部結合 int i1; // 正しい仮定義,前の定義を参照する int i2; // 前に内部結合をもつ定義があるため,結合の不一致が生じ,6.2.2 によって動作は未定義となる int i3; // 正しい仮定義,前の定義を参照する int i4; // 正しい仮定義,前の定義を参照する int i5; // 前に内部結合をもつ定義があるため,結合の不一致が生じ,6.2.2 によって動作は未定義となる extern int i1; // 外部結合をもつ前の定義を参照する extern int i2; // 内部結合をもつ前の定義を参照する extern int i3; // 外部結合をもつ前の定義を参照する extern int i4; // 外部結合をもつ前の定義を参照する extern int i5; // 内部結合をもつ前の定義を参照する 例2. 翻訳単位が int i[]; を含み,その翻訳単位の最後で,配列i が依然として不完全型をもつ場合,配列i は暗黙の初期化子によって一つの要素をもつようにされる。その要素にはプログラム開始時に0 がセットされる。
122 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/10(月) 18:45:17.26 ID:srG0I8DXr.net] N1570のリンクを貼ったら、真実を知った>>100 が傷ついちゃうかも知れないと思って遠慮してた
123 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/10(月) 23:59:41.82 ID:srG0I8DXr.net] とりあえずC++のリンケージ仕様でも投下しとくか www.open-std.org/JTC1/SC22/WG21/docs/papers/2017/ ここのN4660(C++17 DIS)の6.5節の段落3〜4あたりだな
124 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/11(火) 15:06:41.62 ID:xAQ0kPvC0.net] パスいるやん
125 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/11(火) 17:53:37.33 ID:gmpvjUS3r.net] まじか じゃあ同じ内容のN4659で
126 名前: ◆QZaw55cn4c (ワッチョイ beff-rt0y) mailto:sage [2017/04/12(水) 19:45:40.04 ID:r8mKYRyu0.net] >>122 いや,だからC++の話だったら仮定義はない,って >>99 で書いたつもりだが, C++ のリンクを貼ってなにを言おうとしているの?
127 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/12(水) 22:5
] [ここ壊れてます]
128 名前:2:37.49 ID:hzellBg9r.net mailto: >>125 Cの仕様が示されたのだから次はC++での仕様が示されないと>106が可哀想ではないか スレ違いの仮定義ではなくexternの意味・リンケージとの関係が本題だったと記憶 [] [ここ壊れてます]
129 名前:デフォルトの名無しさん (ワッチョイ db57-EaKP) [2017/04/13(木) 12:41:59.49 ID:NIQ3hjXd0.net] んだね
130 名前:デフォルトの名無しさん (ワッチョイ eb00-AM0K) [2017/04/13(木) 17:14:46.56 ID:IqLxmvNO0.net] moduleが標準入りするのはいつごろよ?ついでにD言語のversionとaliasもパクって完全体になってほしいね
131 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/13(木) 18:41:48.04 ID:RdwWAERL0.net] それよりネットワーク関連を標準化しろ この際asioでも許容
132 名前:デフォルトの名無しさん (ワッチョイ 3b32-Lcy7) mailto:sage [2017/04/13(木) 21:28:48.50 ID:n9EAyVre0.net] asioとhttp系の何かつけてくれ
133 名前:デフォルトの名無しさん (ワッチョイ eb86-HE/W) mailto:sage [2017/04/15(土) 11:47:11.44 ID:BNJEkz/Q0.net] >>129-130 ネットワークライブラリを作っております 遊んでみてください、宣伝失礼しました。 https://github.com/Ichishino/subevent
134 名前:デフォルトの名無しさん (ササクッテロル Sp6f-cQmk) mailto:sage [2017/04/15(土) 11:52:21.06 ID:0ry10bQQp.net] 標準で入ってることが重要なんじゃないかなあ…
135 名前:デフォルトの名無しさん (ワッチョイ 1f6b-HE/W) mailto:sage [2017/04/15(土) 11:56:11.76 ID:JwQS3cI30.net] 炊飯器用の小さいネットワークライブラリも必要になるんじゃねえの
136 名前:デフォルトの名無しさん (ワッチョイ 0f1f-V7Gz) mailto:sage [2017/04/15(土) 12:21:35.22 ID:QXvRHshA0.net] 漁師さん用も頼む
137 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/15(土) 14:16:17.69 ID:/RNhb41k0.net] 外部ライブラリっていうだけでハードル高くなるからな 仕事で使いづらいのはもちろんとしてOSSでも使用者に各ライブラリを掻き集めてもらわないといけなくなるから最小限にしたい
138 名前:デフォルトの名無しさん (ワッチョイ 1fb2-EaKP) [2017/04/15(土) 21:37:48.57 ID:53BEnEdf0.net] 論理積で空集合になったからといって じゃあ論理和にしろと? 頭悪すぎだろ
139 名前:デフォルトの名無しさん (ワッチョイ eb59-0/8P) mailto:sage [2017/04/15(土) 22:25:04.54 ID:D67U9VSC0.net] 静的型付け言語でオブジェクト指向すると 基底クラスにメソッドが集まっていく…
140 名前:デフォルトの名無しさん (ワッチョイ efa6-HE/W) mailto:sage [2017/04/15(土) 22:33:53.11 ID:uwyLFIA10.net] それはよくない兆候だよね
141 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/15(土) 23:01:12.27 ID:/RNhb41k0.net] 何故テンプレートを使わないのか
142 名前:デフォルトの名無しさん (ワッチョイ eb59-0/8P) mailto:sage [2017/04/16(日) 01:51:56.03 ID:M1nx5OGg0.net] 基底クラスにメソッドが集まっていくのは仕方が無いにしても、 公開する相手別にインターフェースを分けて抽象クラスの多重継承でもしておけば 大きな混乱は避けられる 希ガス
143 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/16(日) 03:21:47.75 ID:9vBuyRLK0.net] 仕方ないか? そういう場合大抵は派生先のあのクラスとあのクラスでこれ使うから基底にいれとこうみたいになってis aじゃなくなってる気がする
144 名前:デフォルトの名無しさん (ワッチョイ 3b0d-T+tu) [2017/04/16(日) 10:05:38.55 ID:P5/zt8YK0.net] 俺も>>141 に一票かな。 基底クラスに集まって来るような関数群は、共通に使うという一点に於いてのみ意味があることが多いんだよね。 と、すると、大抵別クラスとして分離可能になるってケースが多い気が。 つまり、実はhas-aが妥当で、それどころかUMLで言うところの依存関係だけで問題ない事が多いという。
145 名前:デフォルトの名無しさん (ワッチョイ bbf4-aC3X) mailto:sage [2017/04/16(日) 13:02:22.02 ID:FhXvPItE0.net] dynamic_castは悪という間違った考え方が基底に余計なメンバ関数を実装させる原因
146 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/16(日) 13:15:07.28 ID:cLuVKvb50.net] dynamic_castが悪いのではなくdynamic_cast使いまくるようなら設計に問題があるのではないかという話なのでは
147 名前:デフォルトの名無しさん (ワッチョイ 4b3c-yJ/5) mailto:sage [2017/04/16(日) 14:09:06.37 ID:1LAAxzhm0.net] おっと、Javaを悪く言うのはそこまでだ
148 名前:デフォルトの名無しさん (オッペケ Sr6f-xkGs) mailto:sage [2017/04/16(日) 14:12:39.55 ID:kL6yOSUfr.net] 144がアスペなのは間違い無い
149 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/16(日) 14:49:30.10 ID:9vBuyRLK0.net] 144を理解出来ない146が…
150 名前:デフォルトの名無しさん (ワッチョイ eb59-0/8P) mailto:sage [2017/04/16(日) 14:53:55.66 ID:M1nx5OGg0.net] 知らね ゼロから設計するならともかく、すでに出来上がった構造に仕様追加がなされた場合、 基底クラスにメソッドを追加する流れになりがち かつdynamic_castはある意味オブジェクト指向的解決手段と言えるかもしれないが、 静的型付けという枠組み(>137)から逸脱する
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にしたら自動的にテンプレートになって、 文句がある場合のみ手動で特殊化が一番助かるんだが。