- 1 名前:デフォルトの名無しさん [2018/08/27(月) 16:02:00.94 ID:vY3QDx2y0.net]
- 次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part137 https://mevius.5ch.net/test/read.cgi/tech/1531558382/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.103【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1530384293/ ■長いソースを貼るときはここへ。■ 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
- 596 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 17:15:33.49 ID:K+jLUYtn0.net]
- >>583
void svd(Matrix &pMtx); みたいな関数ではダメなの?
- 597 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 17:45:50.45 ID:nytN4gJ8r.net]
- >>584
移譲という用語は初めて知ったので、勉強してみます >>585 ダメ、ということはないと思いますしこれまではそうしてきました しかし、行列の特異値分解は配列ではなく行列に適用するべきだという意識が強くなりました BLAS 等の多くてややこしい引数も、「行列を渡す」という形で書くことでもう少し自分にとって読みやすくなるのではないかとも思いました クラスだとか他人のコードの拡張といったことを勉強してみたくなったということでもあります
- 598 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 18:21:14.81 ID:FzfC+eZt0.net]
- >>586
なんでもかんでもメンバ関数として持たせるのはダサいというのが近年の風潮。 設計方針にもよるんだけど、機能をちょっと増やすたびに新しい型を作るのも馬鹿馬鹿しいだろう。 単なる関数として作ればそれでよいはずのことにクラスの依存関係まで出てくるの、ホントに良くない。
- 599 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 18:35:46.91 ID:nikK7GUa0.net]
- >>584
>どちらか迷ったら移譲 やめろ、割とマジで 本来継承が好ましいものに委譲を使うと後々になって必ず破綻する お前D&E読んでないのか? >>587 >ダサいというのが近年の風潮 そういう言い方・考え方もやめろ かつてC++の継承は汚いからテンプレートで代用しろ、みたいな理屈があったが全くの空回りに終わった その間初心者は嘘の情報に騙されたりオブジェクト指向を誤解したりして、結果C++から離れていった >単なる関数として作ればそれでよいはず これは正しい
- 600 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 18:37:09.46 ID:MaoTi4980.net]
- >>587
完全に同意。 クラスの数が星の数ほどあるプロジェクトで、継承してメソッド一個追加してるだけとかの経年劣化したソース見たら目眩がするわ。 オブジェクト指向の初期啓蒙として「既存のクラスは変更するな」「機能追加は継承使え」って言ってた人を恨むわ。
- 601 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 18:40:06.68 ID:MaoTi4980.net]
- >>588
もちろん「IS-A」が成り立ってる継承が適してるものは継承使うべき。 むしろ継承を使うべきでないとこに継承使ってるほうが後々破綻するので悩んだら委譲。
- 602 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 18:53:16.27 ID:nVnA1Sbpr.net]
- >>588-590
では特異値分解、スライシング、掛け算、足し算、エトセトラ……、という大規模な機能追加を既存のクラスに対して行ないたい場合はどのようにするべきでしょうか
- 603 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:06:55.02 ID:MaoTi4980.net]
- >>591
うーん、場合によるけど全てそのクラスに対する操作ならさすがに継承するかな。 後々のメンテ考えたら可能であれば継承元のクラス変更するけど。
- 604 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:18:19.30 ID:scCYqhjF0.net]
- 他人が作ったクラスで勝手にいじれないんでしょ?
protectedやvirtualなメンバがあって、それを使って色々するなら当然継承すればいいけど そうじゃない継承される前提で作られたクラスじゃないなら継承はオススメできんなあ svd(m)をm.svd()って書きたいためだけに継承の山のようなトラップ抱え込むのは割に合わないと思うよ どうせ親クラスのprivateはいじれないんだし
- 605 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:20:28.05 ID:wzHnJ4yt0.net]
- unified call syntax 甦れ。
- 606 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:24
]
- [ここ壊れてます]
- 607 名前::14.64 ID:nikK7GUa0.net mailto: >>591
使ってるのはuBLASだっけ?調べてないのでわからんけど・・・・ 継承を前提にしたクラス(デストラクタがvirtualであり、実際継承してみても使える)なら継承もアリっちゃアリだとは思う (責任は負わんw あくまで勉強目的でやってみるのはいいと思う) ただ、特異値分解は知らんのでわからんけど、一般に演算クラスの機能追加は >>587の言う通り、単純にそのクラスを受け取るグローバル関数にする方がいい 特に >掛け算、足し算 こんなのはまさにメンバ関数にしなくても、グローバルに演算子オーバーロードを定義すれば済む (メンバに書いてもグローバルに書いても利用者側はA * Bって書ける あとv1.dot(v2)よりdot(v1, v2)のがわかりやすいと思うけどね [] - [ここ壊れてます]
- 608 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:48:50.66 ID:MaoTi4980.net]
- >>595
完全に同意。
- 609 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:58:47.83 ID:nVnA1Sbpr.net]
- >>592-596
なるほど。 普通に関数にするのが、必要十分さの面で、良さそうですね。 頭の中にあったのは、自分で作った関数群が全て○○というクラスに対して使用することを想定している、と明示したかったということです。 グローバル関数の用途を明らかにする方法として、メンバ関数化すれば良いのかな、と思いました。 メンバ関数にはしないということにした場合、上のことを実現するにはどうするべきでしょうか。 コメントやノートに書くくらいしか思い付きませんが、それで良いのかな
- 610 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:09:39.68 ID:scCYqhjF0.net]
- 引数の型が○○やconst ○○&になるでしょ
それ以上のなにが欲しいの?
- 611 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:10:46.02 ID:nikK7GUa0.net]
- そういえばBLASとは書いてたけどuBLASとは書いてなかったな
いずれにしても、その扱いたいクラスを受け取る関数だから見たらわかるっしょ 違う型を渡したらエラーになる
- 612 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:12:28.34 ID:+2gqfJ3dM.net]
- >>597
どうでもいいけど最初と大分キャラ変わってるぞw
- 613 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:17:41.28 ID:nVnA1Sbpr.net]
- >>598-599
わかりました。 確かに型を見たら自明ですね。 結局は > svd(m)をm.svd()って書きたいためだけ だったのかも知れません。 なんせそういう書き方はいかにも「ぽい」ですから。 ありがとうございます。
- 614 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:19:42.40 ID:KRvbJL35d.net]
- >>601
横レスになるかもだけど多相的に
- 615 名前:関数の集合を規定したいなら[C++ traits]で検索すると幸せになれるよ
今回は不要だと思うけど後々欲しいなって思ったとき役に立つ [] - [ここ壊れてます]
- 616 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 20:43:37.20 ID:FzfC+eZt0.net]
- >>588
いや、風潮っていうのは確かにあるよ。 かつて上手くいかなかったから今もダメとは限らない。 テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、 それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。 今はクソみたいな SFINAE と type_traits で不格好になんとかしてるのも C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。 Rust や Go の隆盛でプロトコル指向への理解が深まっているというのもある。
- 617 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 21:06:19.19 ID:nikK7GUa0.net]
- ・・・・・俺が何を批判したかわかってないな
「ダサい」とか「風潮」じゃなくて、何故それが好ましいか、好ましくないか、 質問者のケースに合った説明をしろっつってんの なんで当時の「テンプレートで継承の代用」の例を出したかわからんか? 代用にはなり得ないんだよ原理的に 実行時のポリモーフィズムをテンプレートで実現できるのか? ユーザーの入力やファイルの内容に従って実行時に作るオブジェクトを変え、かつ それを1つの型でまとめられるのか?? type erasure(boost::any含む)とかswitchとかif使う、とかは無しでな 自分の頭でその方法が合っているか合っていないか考えずに 流行とかに流された結果が、↑で挙げたソレなんだよ C++潰したいのかよ
- 618 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 21:35:12.47 ID:MaoTi4980.net]
- >>604
これも横からだが、C++はもう役割を終えて衰退機だと思う。 今から積極的にC++を採用する分野は限られていて、使えるor使おうと思うエンジニアの絶対数が減るってことは衰退と同義だと思う。 いろんな言語のエッセンスを学べるので悪い言語でないとは思うけど、誰かが言った通り習得のコストに見合ったメリットがない。 盛者必衰。
- 619 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 21:55:31.46 ID:FzfC+eZt0.net]
- >>604
> 何故それが好ましいか、好ましくないか、 > 質問者のケースに合った説明をしろっつってんの それは >>587 の説明で足りないか? 風潮があって、その理由は不要な複雑さが出来るからだという説明で足りないか? この説明は質問者のケースに合致してないか? > 代用にはなり得ないんだよ原理的に 違う機能が違う能力を持つのは当たり前だろ? 説明するまでもなく。 どちらの機能を中心に活用した「設計」がよいのかっていう話じゃないか。
- 620 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 22:01:19.22 ID:nikK7GUa0.net]
- >>606
ああすまん、確かに言葉尻に反応したところはあったな でも「風潮」とか「ダサい」って蛇足だよな?w ダサいって言いたかっただけやろ? >違う機能が違う能力を持つのは当たり前だろ? お前>>603で >かつて上手くいかなかったから今もダメとは限らない。 >テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、 テンプレートを盲信してるようだから説明したんだが。 継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ? >C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。 とか言ってる辺りからも、オブジェクト指向は過去のものだから継承も過去のものなんだぜ、とか 抜かしたかったのがわかる マルチパラダイムの意味わかってる?
- 621 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 22:15:11.22 ID:M9VunTBo0.net]
- 継承をテンプレートで置き換えるって失敗したというよりもすでに当たり前になっただけでは
むしろそっちはそっちで発展してるし、動的でなくてもいいケースは確かに存在している
- 622 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 22:20:50.92 ID:nikK7GUa0.net]
- >>608
静的に解決できるものならそうだろうな そういうケースを否定はしてないが、当時はあちこちでそういう失敗例がドヤ顔で披露されてたんだぞ 禿も指摘してるようにJavaのせいだが
- 623 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 22:46:33.24 ID:FzfC+eZt0.net]
- >>607
> 継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ? 違うものは違う。 代用品ではない。 継承構造の代用品としてテンプレートを使えというのではなく、 テンプレートも前提のひとつとしたデザインにしろと言ってんの。 「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。
- 624 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:01:04.77 ID:nikK7GUa0.net]
- >>610
>>603で >かつて上手くいかなかったから今もダメとは限らない。 >テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、 >それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。 って言ってるよな 「かつて上手くいかなかった」って、 俺の「かつてC++の継承は汚いからテンプレートで代用しろ、みたいな理屈があったが全くの空回りに終わった」 のことだろ?言い逃れしてんじゃねーよ ちなみに継承をテンプレートで代用、を挙げたのは、それに初心者が惑わされたからだ ただのテクニックの紹介ではなく「C++の継承は汚い」みたいな暴言を伴ってな お前が「ダサい」とか「風潮」とか、自分がドヤりたいがために選ぶ言葉と同じだよ >「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。 質問者の「関数追加」の方法についてはお前の意見に賛同してるだろうが
- 625 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:02:28.75 ID:ZQgI79kj0.net]
- 質問者を放置してドヤ顔で語るオタクたち
- 626 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:10:39.91 ID:nikK7GUa0.net]
- あ、ついでに言うと
>言語そのものとしてのサポートが不充分だった ねーよ C++98〜03でも十分メタプログラミング出来てたぞ(11から確かに幅は広がったが STLしかりModern C++ Designの著者のLokiしかり Boostだって当時からあったからな
- 627 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:26:46.84 ID:wfTNvghC0.net]
- >>605
C++に挫折でもしたの? w ネイティブコード吐けるオブジェクト指向言語ってそんなに選択肢ないし
- 628 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:30:11.36 ID:wzHnJ4yt0.net]
- FixedC++であるRustに期待はしているが・・・。
- 629 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 23:41:33.16 ID:FzfC+eZt0.net]
- >>611
なんでその結論に納得できるのに前提に色々言ってんだ? テンプレートについてはそっちが言い始めたことで、別の話題だろ? 代用という言葉の使い方がちょっとずれてるだけじゃないの。 そのまま置き換えれるかという意味では代用できないし、 継承でなんとかしてたデザインをテンプレートを活用したデザインに置き換えられる (こともある) という意味では代用ともいえる。 言葉については、「ダサい」はともかく、「風潮」に何か問題あるか? それは全くわからんな。 デザインの風潮というものは間違いなくある。
- 630 名前:はちみつ餃子 mailto:sage [2018/09/22(土) 00:00:10.67 ID:cynlNZMd0.net]
- >>613
無理無理。 今だってろくでもない回りくどい仕組みでどうにかこうにか 型の制約を表現できてるってだけだもの。 初心者にそれを元にデザインさせるのは無理。 型の制約についての知見とは別に C++ の言語機能が足りてない。
- 631 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 00:04:20.29 ID:0je8S2eS0.net]
- >テンプレートについてはそっちが言い始めたことで
ダサいとかイケてるとか風潮とかで設計を語るからだよ お前の説明はだいぶ甘い、自分でよくわかってないものを押し付けてないか? そういう傾向を指摘されたって気づいてるだろ? 自分のコーディングの経験が足りてないゆえに、はっきり断言できないから風潮とか出てくるんだろ? さっさと謝ってりゃここまで言ってないんだがな >デザインの風潮というものは間違いなくある。 そう思ってんのはお前らアマチュアだけだから。(特にお前の思ってるようなデザインについては) >>617 何の話してんの?コンセプト?w なんで初心者がまだ導入されてないコンセプト前提の設計しなきゃならないの?馬鹿なの? コンセプト入ったら実行時のポリモーフィズムをテンプレートで出来るの????wwwwww
- 632 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 00:11:49.56 ID:vYximTvP0.net]
- 最初はもてはやされたけど、みんな知ってる前提になったら特に触れられもしなくなった
風潮ってこいうのだろw
- 633 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 00:12:42.81 ID:0je8S2eS0.net]
- すまんちょっと熱くなりすぎた
論破されたことに気付かないアホ(あるいは謝ったら死ぬ病)相手にするとキリが無いわ・・・・ もうやめとく
- 634 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 01:40:05.82 ID:3xdfFsZb0.net]
- 権限の委譲というと良いものを与えているイメージだが
UML用語の委譲はどうみても仕事の丸投げとかたらい回しな印象であるイメージ な気がする
- 635 名前:572 mailto:sage [2018/09/22(土) 02:14:06.30 ID:3xdfFsZb0.net]
- 昨日のプログラムを改良したったwwwww
ttps://ideone.com/hkeEp0 データ数N=300のときCore i7-860 (2.8 GHz)で8秒かかる。idoneのやつでも5秒。 N=1000だと宇宙の終わりまでかかる予定。 これで漏れも低学歴知恵遅れに晴れて仲間入りDA☆NE!
- 636 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 03:45:26.27 ID:57qyxfm80.net]
- https://ideone.com/CYkJfe
高速化する話なのか低速化する話なのかは分からんけど、素直に書いたらこんな感じかなぁとか。 終わった話題かもしれんけど。 どうしても高速化したいんやったら、関数を並列実行できるようにして、 https://cpprefjp.github.io/reference/thread/thread/hardware_concurrency.html 上記の数で分割実行かなぁとか。 フューチャー投げるのはそんなに難しくないと思う。std::async使えば簡単だし。
- 637 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 03:54:48.35 ID:57qyxfm80.net]
- 気が付いたら、absがテンプレート関数じゃなくなってた。
- 638 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 07:17:07.67 ID:ieaomBGwa.net]
- constexprな関数はコンパイル時でも実行時でも使えるが、定数になる文脈とならない文脈で関数を使い分けしたい。そういう使い分けは可能だろうか?
例えばsqrt関数はconstexprになっていないが、 アルゴリズム的には自作関数でconstexpr対応可能 ただし速度的にはcmathのsqrtの方が何倍も早いのでconstexprでない文脈の時にはcmathのsqrtを呼び出したいのです。
- 639 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 07:58:27.87 ID:0je8S2eS0.net]
- is_constexprで検索したらそれっぽいアイデアは出てくるけど
- 640 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 09:39:59.40 ID:qCwQCuMG0.net]
- >>625
ビルド過程を見直せば? バカみたいに何でもかんでもconstexprに頼る理由はない。
- 641 名前:はちみつ餃子 mailto:sage [2018/09/22(土) 12:24:16.36 ID:cynlNZMd0.net]
- >>618
なんで実行時ポリモーフィズムの話なんか出てるんだ? 出来ないもんをやれなんて言ってないだろ。 関係ない要素をどんどん出してくるなよ。 何を言いたいんだ?
- 642 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 13:05:08.82 ID:PHVB0Lj2M.net]
- templateで躓いてるんですけど皆どうやってテンプレートを勉強したんですか?
- 643 名前:デフォルトの名無しさん [2018/09/22(土) 13:06:49.63 ID:sAfENX6G0.net]
- 車輪の再発明
- 644 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 13:16:51.91 ID:EBMrcrP1a.net]
- 何を悩んでる?
- 645 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 13:22:32.93 ID:PHVB0Lj2M.net]
- >>631
Boostのテンプレートを読んでるのですが、理解できない点です
- 646 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 13:36:27.52 ID:a9vdXzW90.net]
- >>632
まずはstlは一通り不自由なく使えるかな?
- 647 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 13:45:08.87 ID:PHVB0Lj2M.net]
- >>633
はい、STLに関してはそれなりに使えます
- 648 名前:はちみつ餃子 mailto:sage [2018/09/22(土) 13:53:36.62 ID:cynlNZMd0.net]
- >>632
Boost はかなり技巧的で無理やりなこともやるので、 ある程度 C++ をわかっている人でもまともに読めないこともある。 普通に入門書とかを読むところから始めるしかないんじゃね?
- 649 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 15:05:35.09 ID:JTph0UBg0.net]
- boost読んでテンプレート勉強しようとするのは、IOCCCでCを勉強しようとするのと同じくらい無謀
- 650 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 23:16:14.20 ID:Img386zI0.net]
- test
- 651 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 23:16:57.30 ID:02eserMU0.net]
- アホ
- 652 名前:デフォルトの名無しさん [2018/09/23(日) 00:42:54.42 ID:cRG95Xcq0.net]
- boostのインチキくさそうなソケット通信とか使ってるヤツいんの
普通にsocket通信の関数で書いたほうが可読性が高そうで困る
- 653 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 01:28:26.89 ID:MC3A3QT40.net]
- SG4に標準化提案はされてるみたいね
- 654 名前:はちみつ餃子 mailto:sage [2018/09/23(日) 03:10:01.78 ID:SNhvYMGK0.net]
- >>639
Boost のことはよう知らんけど、 Boost の他のライブラリと組み合わせやすいとか、 そういう利点はないの?
- 655 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 09:37:53.48 ID:LgC14Oo10.net]
- bool operator<(const T& a, const T& b)は定義されている前提で、
クラスTについてbool operator==(const T& a, const T& b)が定義されていたらそのoperator==()を使い、 定義されていなかったら bool operator==(const T& a, const T& b) { return (!operator(a, b) && !operator(b, a)); } を勝手に補完するようなテンプレート(の特殊化?)ってどうやって書くの?
- 656 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 11:39:09.69 ID:A6XCmyXs0.net]
- std::rel_ops空間に == から != を、< から <= > >= を合成するテンプレートならあるけど
- 657 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 12:14:54.07 ID:loi8GnJQ0.net]
- これとかに載ってなかったっけ?
https://www.amazon.co.jp/dp/4894714353/?tag=hatena_st1-22&ascsubtag=d-7dzm
- 658 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 14:13:03.08 ID:oyuLVtOs0.net]
- detection idiomで検出してSFINAEで分岐させるだけでできそうだけど
- 659 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 14:26:07.42 ID:Dpz6ufMn0.net]
- barton nackman trickやな
operator ==が定義されているかどうかの分岐はSFINAEいるんでちょっと複雑になりそうだけど private継承する基底を選ぶような形にできるはず
- 660 名前:デフォルトの名無しさん [2018/09/23(日) 16:41:12.46 ID:d60j7qb90.net]
- そんなことができるざんすか。
めんどくさそうですな。
- 661 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 16:42:46.60 ID:oyuLVtOs0.net]
- if constexprつかえばSFINAEいらんな
普段使えない環境だから出てこなかった・・・
- 662 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 17:06:46.21 ID:LgC14Oo10.net]
- スフィ姉たまんねぇ
ていうか>>643見てnamespace rel_opsの定義見て考えたがSFINAE要らなくね? コンパイラの挙動(関数名の解決規則?)として、 Tについてoperator==(const T& a, const T& b)そのものズバリが定義されていればそれが使われるし、 無ければその次以降にテンプレートを探しに行こうとするから、 そのときstd::rel_ops名前空間が導入されていれば勝手にテンプレートバージョンが使われる というしくみっぽい?
- 663 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 17:18:52.49 ID:oc2N8BDIM.net]
- >>632
バリバリのテンプレート使いいませんか? テンプレート難し
- 664 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 17:45:10.35 ID:oyuLVtOs0.net]
- >>649
あーたしかに 試してみたらいけた
- 665 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 17:58:10.59 ID:Dpz6ufMn0.net]
- >>648
if constexprほとんど使ったことなかったけど便利だなー 確かに型で分岐する必要なかった https://wandbox.org/permlink/8CGWlZ5i5JLl33Ws >>649 その方法だと、>>642で言ってるような特殊な補完を他のクラスにも適用することにならん? それでもいいならいいけど
- 666 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 19:13:07.53 ID:3hdlUg1R0.net]
- >>650
わかんないなら質問すればいいじゃん 何がわからないから分からないと本とかのおススメもできないだろ
- 667 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 21:11:00.27 ID:ygIHva++9]
- https://ideone.com/uNCJuL
なぜデストラクタが2回呼ばれるのか分かりません。 理由を教えてください。
- 668 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 21:04:04.43 ID:LgC14Oo10.net]
- >>652
>その方法だと、>>642で言ってるような特殊な補完を他のクラスにも適用することにならん? ならない。ならずに済ませられることができる 補完する演算子のテンプレートの導入範囲を
- 669 名前:名前空間で限定すればおk↓↓↓
ttps://ideone.com/p4FS43 21行目のOP_EQ_FOO_ENを定義してもしなくてもビルドが通り、Foo::operator==()の呼び出し回数を除き同じ結果になる。 ただし、operator==()についてはちょっぴり闇が深いことがわかった。 名前空間std::rel_opsにはoperator==()テンプレートが存在しない 上のサンプルではstd::rel_ops名前空間に無理矢理operator==()テンプレートを追加したが、 実際にやるときは独自の名前空間でoperator<()以外の全部(==、!=、>、<=、>=)を用意しておくことになるん ジャマイカ [] - [ここ壊れてます]
- 670 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 21:30:04.73 ID:Dpz6ufMn0.net]
- あーすまん、目的を誤解してた
クラスのoperator ==の実装を省きたいんじゃなくて使う側で補完できればいいのか
- 671 名前:デフォルトの名無しさん [2018/09/24(月) 00:24:52.05 ID:rSek34EXa.net]
- 5年くらい前?にテンプレートプログラミングっぽい趣旨の本があったし、基本情報に何故かPrologと同じジャンルにテンプレートが言語として載ってる辺り論理型言語っぽい事ができるみたいだが、基本C++の1機能でしか無いから、知ってる人は少ないんじゃ無い?
俺も知らない。
- 672 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 00:56:28.11 ID:cIWp1XlU0.net]
- C++テンプレートテクニック 第2版、
επιστημη(えぴすてーめー)・高橋 晶、2014 C++ 標準化委員のεπιστημη の本だろ。 ドワンゴ江添亮も、需要があれば、こういう本を書きたいって言ってたけど
- 673 名前:デフォルトの名無しさん [2018/09/24(月) 01:06:54.52 ID:rSek34EXa.net]
- それそれ。
出来るっぽいってのは知ってても、実際できてる奴少ないと思われ。
- 674 名前:デフォルトの名無しさん [2018/09/24(月) 01:14:19.28 ID:Kxio7RVg0.net]
- テンプレート使うのに
いちいちそんな悩むもんなんか なにかを参考にしたいようだが たとえばtraits乱用してるようなのは読む必要もないし 逆にマネする必要がないわ
- 675 名前:デフォルトの名無しさん [2018/09/24(月) 01:21:07.01 ID:rSek34EXa.net]
- 俺も気にした事ないけど、気になる奴は気になるんだろう。
俺の場合は整数型をどうやって文字列型にしてるんだ?ってのが疑問でむしろアセンブラに走って頭捻って理解した。 まあ人間そんなもん。
- 676 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 01:37:53.34 ID:orHhPIQU0.net]
- テンプレートはC++の必須教養だと思ってるけど、別になくても困らないしな・・・
- 677 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 01:47:51.69 ID:sBjtzBeV0.net]
- >>662
つ vc++ 1.x こいつのテンプレートは泣ける
- 678 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 01:54:17.59 ID:XuY/8j5Q0.net]
- >>657->>662
同感 はちみつと言い争ったときに >>デザインの風潮というものは間違いなくある。 >そう思ってんのはお前らアマチュアだけだから。(特にお前の思ってるようなデザインについては) とか書いたけど 実践ではなく仕様メインで覚えてる人(趣味でC++の知識を集めるのがメインの人であり、アマチュア)は 「これからの時代はテンプレート使った総称的プログラミングが主流」 みたいなパラダイムの変化を訴えてるけど、それはっきり言って素人が見れるコードでだけだから・・・ (C++標準ライブラリやBoost等) テンプレート使ってとことん汎用性を高めたライブラリなんか、普通のソフト開発の現場では使われんわ あまりにも時間がかかりすぎる そういうごくごく一部の偏ったソースしか読んだことないから誤解するんだろう で、その誤解した趣味グラマのネット上の言説やライターが書いた本を読んで、 初心者がC++に挫折して去っていくという・・・・・ C++なんか最初はベターCでいいんだよはっきり言って あと最近ネット見てて(C++の)オブジェクト指向とかC時代の古いノウハウの解説が少ないのは、 単にとっくに出尽くしたからだからな、最近始めたやつは誤解したらだめよ
- 679 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 02:00:05.34 ID:XuY/8j5Q0.net]
- 訂正
Xテンプレート使ってとことん汎用性を高めたライブラリなんか ○テンプレート使ってとことん汎用性を高める開発手法なんか
- 680 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 02:14:19.64 ID:tUW1+gfS0.net]
- >>664
「何もかもを継承構造で解決しようとするな」の ひとつとしてテンプレート (を C++ なら利用することになるプロトコル指向的デザイン) が出たんだし、 C++ にコンセプトの概念を持ち込もうとする機運があるほどには活用比率も高まるだろう、という程度の主張なのに、 「とことん汎用性を持たせるべき」とか「主流になる」みたいな拡大解釈はやめてくれよ。 俺はそんなこと主張してないからね!
- 681 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 02:32:05.77 ID:XuY/8j5Q0.net]
- >>666
しつこいぞ >テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって 「おかしな流行が発生して初心者を惑わした」、に対して反論したんだろ?嘘つくなよ >俺はそんなこと主張してないからね! 主流になる、って意味だろ?これ↓ >C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。 ちなみに >コンセプトの概念を持ち込もうとする機運 コンセプトは標準化委員会や禿が言い出したことだぞ 導入されたら素晴らしいとは思うが、元々はテンプレートを使ったコードのエラーメッセージをどうにかすることと テンプレートパラメータで満たすべき要件をコメントではなくコードで示せるようにすることだ プロトコル指向は聞いたことないが、それはコンセプトで可能になるおまけ程度だろ しかもそれを利用するにはテンプレート必須なわけで、コンセプトが入ろうが、 クラスなどが実際どういう仕組みなのか程度のことは把握してないと、初心者が手を出せるようなものではないし 出させるべきでもない
- 682 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 02:45:26.39 ID:tUW1+gfS0.net]
- >>667
変な (教え方なり使い方なりが下手くそな) 流行があったということを以て テンプレートの活用を全否定するような言い分に反論したんだよ。 テンプレートが無くて良いと思ってるわけじゃないんだろ? > 主流になる、って意味だろ? 今までが継承構造に頼りすぎだったのが是正されるという意味だ。 初心者への教え方については、また別の話。 ベターCからで良いという意味のことは D&E にも書かれてる基礎理念だから そこは疑ってない。
- 683 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 02:59:37.96 ID:XuY/8j5Q0.net]
- >テンプレートの活用を全否定するような言い分に反論したんだよ。
>>587と>>588を100回読み直せボケが 悪いけど、お前まともにメタプログラミングやってないだろ? まともに活用して利点・欠点をはっきりわかってないやつが何偉そうに語ってんの? しかもその理由で反論したんなら、なおさらポリモーフィズムの話で論破されただろ、 なんで認めずに自分の主張の意味を途中から変えてまで言い返してんの? 図星突かれて気分が悪いってか? >今までが継承構造に頼りすぎだったのが是正される 誰が頼りすぎてたの??今までっていつまで? >初心者への教え方については、また別の話 今まで何度も「こいつ初心者にテンプレート勧めてるよ・・・・何考えてんだ」と思ってたんですが どの口で言ってんだ
- 684 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 03:17:34.86 ID:tUW1+gfS0.net]
- >>669
ポリモーフィズムの話ってなんだ? 初心者へじゃなくて、 君に、テンプレートの話はしてたつもりだが。 (ID 変わってるから他の人だったらスマソ) 他の人にアンカーを付けてテンプレートの話はしてないだろう。
- 685 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 03:38:10.37 ID:tUW1+gfS0.net]
- >>669
> 誰が頼りすぎてたの?? 標準ライブラリすら。 その他はまあ、私の実感なので、違うというなら違うのかもしれない。
- 686 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 03:48:16.31 ID:tUW1+gfS0.net]
- 「美味しんぼには我慢ならん」
「おい、辛抱しろ」
- 687 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 03:48:58.75 ID:tUW1+gfS0.net]
- 誤爆した。 ごめん。
- 688 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 09:51:46.55 ID:dKKNaNpJ0.net]
- 本当にテンプレートが必要なものってだいたいSTLに揃ってる印象。
あとはTBBみたいにある程度低いレイヤーの抽象化ではどうしても必要にはなる。 しかしこの種類のライブラリってのは本当に信用できる奴が作ったもの以外は 使いたくねーんだわ。 めちゃくちゃデバッグコスト高いからね。 そういう意味で一般プログラマーが実装するってのは実践的ではない。
- 689 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 10:18:16.36 ID:cpSL59m30.net]
- テンプレートは型の定義をすり替えるために使うもの
#ifdefで型切り替える方がもっと糞だからそこはテンプレートにするべき それ以上の凝った事はしないほうがいいね
- 690 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 11:22:17.38 ID:GIs1tf8Y0.net]
- 頼りすぎつーか逆だと思うぜ
コンテナの要件なんかインターフェイスにすればすっきりするのに 紙マニュアル(pdf含む)でガタガタ書かれた口約束とかすげーイヤ 歴史的に見てもそれをやるのに充分な言語機能がもうあったのに
- 691 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 11:36:08.69 ID:tUW1+gfS0.net]
- >>676
現状の C++ では型の制約を表すには意味不明な SFINAE で回りくどくやってて 初心者には使いこなせない (中級者でも不安があったり面倒だったりする) という話の文脈だから、言語機能が充分だというのはちょっと変な立場だ。
- 692 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 11:43:09.69 ID:IXp/Ejzw0.net]
- どうーがんばっても停止性問題は機械的に解けないケースを無くせないのだから
プログラミング自体をアルゴリズム化する企てはどこかで行き詰る 藻前らは行き詰まりかたの良し悪しを議論しているにすぎないのだガハハハハハハ
- 693 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 11:47:19.43 ID:tUW1+gfS0.net]
- >>676-677
ひょっとして抽象クラスでやったらいいという話だろうか。 Java とかから来た人はそういうことをやりがちだけど、 C++ の設計理念からすると、 少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う。
- 694 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 12:24:10.58 ID:GIs1tf8Y0.net]
- >>679
動的結合のコストは関数ポインタなみにはっきりしてるだろ
- 695 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 12:28:24.97 ID:cpSL59m30.net]
- インターフェース(=データメンバーなし抽象クラス)は静的な型の制約を表現できないからダメ
- 696 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 12:58:55.73 ID:XuY/8j5Q0.net]
- >>679
>C++ の設計理念からすると、 >少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う 滅茶苦茶言うな https://cpplover.blogspot.com/2015/09/memoryresource.html >>674 ついでに開発コストも高い STLが優れてるのは、作者が長年コンテナについて熟考に熟考を重ねたライブラリだからであって それを実現するためにテンプレートが使われたに過ぎない テンプレート使ってりゃなんでも有用なライブラリになると勘違いしてるアホが増えた
|

|