18/09/21 18:37:09.46 MaoTi4980.net
>>587
完全に同意。
クラスの数が星の数ほどあるプロジェクトで、継承してメソッド一個追加してるだけとかの経年劣化したソース見たら目眩がするわ。
オブジェクト指向の初期啓蒙として「既存のクラスは変更するな」「機能追加は継承使え」って言ってた人を恨むわ。
602:デフォルトの名無しさん
18/09/21 18:40:06.68 MaoTi4980.net
>>588
もちろん「IS-A」が成り立ってる継承が適してるものは継承使うべき。
むしろ継承を使うべきでないとこに継承使ってるほうが後々破綻するので悩んだら委譲。
603:デフォルトの名無しさん
18/09/21 18:53:16.27 nVnA1Sbpr.net
>>588-590
では特異値分解、スライシング、掛け算、足し算、エトセトラ……、という大規模な機能追加を既存のクラスに対して行ないたい場合はどのようにするべきでしょうか
604:デフォルトの名無しさん
18/09/21 19:06:55.02 MaoTi4980.net
>>591
うーん、場合によるけど全てそのクラスに対する操作ならさすがに継承するかな。
後々のメンテ考えたら可能であれば継承元のクラス変更するけど。
605:デフォルトの名無しさん
18/09/21 19:18:19.30 scCYqhjF0.net
他人が作ったクラスで勝手にいじれないんでしょ?
protectedやvirtualなメンバがあって、それを使って色々するなら当然継承すればいいけど
そうじゃない継承される前提で作られたクラスじゃないなら継承はオススメできんなあ
svd(m)をm.svd()って書きたいためだけに継承の山のようなトラップ抱え込むのは割に合わないと思うよ
どうせ親クラスのprivateはいじれないんだし
606:デフォルトの名無しさん
18/09/21 19:20:28.05 wzHnJ4yt0.net
unified call syntax 甦れ。
607:デフォルトの名無しさん
18/09/21 19:24:14.64 nikK7GUa0.net
>>591
使ってるのはuBLASだっけ?調べてないのでわからんけど・・・・
継承を前提にしたクラス(デストラクタがvirtualであり、実際継承してみても使える)なら継承もアリっちゃアリだとは思う
(責任は負わんw あくまで勉強目的でやってみるのはいいと思う)
ただ、特異値分解は知らんのでわからんけど、一般に演算クラスの機能追加は
>>587の言う通り、単純にそのクラスを受け取るグローバル関数にする方がいい
特に
>掛け算、足し算
こんなのはまさにメンバ関数にしなくても、グローバルに演算子オーバーロードを定義すれば済む
(メンバに書いてもグローバルに書いても利用者側はA * Bって書ける
あとv1.dot(v2)よりdot(v1, v2)のがわかりやすいと思うけどね
608:デフォルトの名無しさん
18/09/21 19:48:50.66 MaoTi4980.net
>>595
完全に同意。
609:デフォルトの名無しさん
18/09/21 19:58:47.83 nVnA1Sbpr.net
>>592-596
なるほど。
普通に関数にするのが、必要十分さの面で、良さそうですね。
頭の中にあったのは、自分で作った関数群が全て○○というクラスに対して使用することを想定している、と明示したかったということです。
グローバル関数の用途を明らかにする方法として、メンバ関数化すれば良いのかな、と思いました。
メンバ関数にはしないということにした場合、上のことを実現するにはどうするべきでしょうか。
コメントやノートに書くくらいしか思い付きませんが、それで良いのかな
610:デフォルトの名無しさん
18/09/21 20:09:39.68 scCYqhjF0.net
引数の型が○○やconst ○○&になるでしょ
それ以上のなにが欲しいの?
611:デフォルトの名無しさん
18/09/21 20:10:46.02 nikK7GUa0.net
そういえばBLASとは書いてたけどuBLASとは書いてなかったな
いずれにしても、その扱いたいクラスを受け取る関数だから見たらわかるっしょ
違う型を渡したらエラーになる
612:デフォルトの名無しさん
18/09/21 20:12:28.34 +2gqfJ3dM.net
>>597
どうでもいいけど最初と大分キャラ変わってるぞw
613:デフォルトの名無しさん
18/09/21 20:17:41.28 nVnA1Sbpr.net
>>598-599
わかりました。
確かに型を見たら自明ですね。
結局は
> svd(m)をm.svd()って書きたいためだけ
だったのかも知れません。
なんせそういう書き方はいかにも「ぽい」ですから。
ありがとうございます。
614:デフォルトの名無しさん
18/09/21 20:19:42.40 KRvbJL35d.net
>>601
横レスになるかもだけど多相的に関数の集合を規定したいなら[C++ traits]で検索すると幸せになれるよ
今回は不要だと思うけど後々欲しいなって思ったとき役に立つ
615:はちみつ餃子
18/09/21 20:43:37.20 FzfC+eZt0.net
>>588
いや、風潮っていうのは確かにあるよ。
かつて上手くいかなかったから今もダメとは限らない。
テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。
今はクソみたいな SFINAE と type_traits で不格好になんとかしてるのも
C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
Rust や Go の隆盛でプロトコル指向への理解が深まっているというのもある。
616:デフォルトの名無しさん
18/09/21 21:06:19.19 nikK7GUa0.net
・・・・・俺が何を批判したかわかってないな
「ダサい」とか「風潮」じゃなくて、何故それが好ましいか、好ましくないか、
質問者のケースに合った説明をしろっつってんの
なんで当時の「テンプレートで継承の代用」の例を出したかわからんか?
代用にはなり得ないんだよ原理的に
実行時のポリモーフィズムをテンプレートで実現できるのか?
ユーザーの入力やファイルの内容に従って実行時に作るオブジェクトを変え、かつ
それを1つの型でまとめられるのか??
type erasure(boost::any含む)とかswitchとかif使う、とかは無しでな
自分の頭でその方法が合っているか合っていないか考えずに
流行とかに流された結果が、↑で挙げたソレなんだよ
C++潰したいのかよ
617:デフォルトの名無しさん
18/09/21 21:35:12.47 MaoTi4980.net
>>604
これも横からだが、C++はもう役割を終えて衰退機だと思う。
今から積極的にC++を採用する分野は限られていて、使えるor使おうと思うエンジニアの絶対数が減るってことは衰退と同義だと思う。
いろんな言語のエッセンスを学べるので悪い言語でないとは思うけど、誰かが言った通り習得のコストに見合ったメリットがない。
盛者必衰。
618:はちみつ餃子
18/09/21 21:55:31.46 FzfC+eZt0.net
>>604
> 何故それが好ましいか、好ましくないか、
> 質問者のケースに合った説明をしろっつってんの
それは >>587 の説明で足りないか?
風潮があって、その理由は不要な複雑さが出来るからだという説明で足りないか?
この説明は質問者のケースに合致してないか?
> 代用にはなり得ないんだよ原理的に
違う機能が違う能力を持つのは当たり前だろ? 説明するまでもなく。
どちらの機能を中心に活用した「設計」がよいのか�
619:チていう話じゃないか。
620:デフォルトの名無しさん
18/09/21 22:01:19.22 nikK7GUa0.net
>>606
ああすまん、確かに言葉尻に反応したところはあったな
でも「風潮」とか「ダサい」って蛇足だよな?w
ダサいって言いたかっただけやろ?
>違う機能が違う能力を持つのは当たり前だろ?
お前>>603で
>かつて上手くいかなかったから今もダメとは限らない。
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
テンプレートを盲信してるようだから説明したんだが。
継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ?
>C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
とか言ってる辺りからも、オブジェクト指向は過去のものだから継承も過去のものなんだぜ、とか
抜かしたかったのがわかる
マルチパラダイムの意味わかってる?
621:デフォルトの名無しさん
18/09/21 22:15:11.22 M9VunTBo0.net
継承をテンプレートで置き換えるって失敗したというよりもすでに当たり前になっただけでは
むしろそっちはそっちで発展してるし、動的でなくてもいいケースは確かに存在している
622:デフォルトの名無しさん
18/09/21 22:20:50.92 nikK7GUa0.net
>>608
静的に解決できるものならそうだろうな
そういうケースを否定はしてないが、当時はあちこちでそういう失敗例がドヤ顔で披露されてたんだぞ
禿も指摘してるようにJavaのせいだが
623:はちみつ餃子
18/09/21 22:46:33.24 FzfC+eZt0.net
>>607
> 継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ?
違うものは違う。 代用品ではない。
継承構造の代用品としてテンプレートを使えというのではなく、
テンプレートも前提のひとつとしたデザインにしろと言ってんの。
「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。
624:デフォルトの名無しさん
18/09/21 23:01:04.77 nikK7GUa0.net
>>610
>>603で
>かつて上手くいかなかったから今もダメとは限らない。
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
>それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。
って言ってるよな
「かつて上手くいかなかった」って、
俺の「かつてC++の継承は汚いからテンプレートで代用しろ、みたいな理屈があったが全くの空回りに終わった」
のことだろ?言い逃れしてんじゃねーよ
ちなみに継承をテンプレートで代用、を挙げたのは、それに初心者が惑わされたからだ
ただのテクニックの紹介ではなく「C++の継承は汚い」みたいな暴言を伴ってな
お前が「ダサい」とか「風潮」とか、自分がドヤりたいがために選ぶ言葉と同じだよ
>「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。
質問者の「関数追加」の方法についてはお前の意見に賛同してるだろうが
625:デフォルトの名無しさん
18/09/21 23:02:28.75 ZQgI79kj0.net
質問者を放置してドヤ顔で語るオタクたち
626:デフォルトの名無しさん
18/09/21 23:10:39.91 nikK7GUa0.net
あ、ついでに言うと
>言語そのものとしてのサポートが不充分だった
ねーよ
C++98~03でも十分メタプログラミング出来てたぞ(11から確かに幅は広がったが
STLしかりModern C++ Designの著者のLokiしかり
Boostだって当時からあったからな
627:デフォルトの名無しさん
18/09/21 23:26:46.84 wfTNvghC0.net
>>605
C++に挫折でもしたの? w
ネイティブコード吐けるオブジェクト指向言語ってそんなに選択肢ないし
628:デフォルトの名無しさん
18/09/21 23:30:11.36 wzHnJ4yt0.net
FixedC++であるRustに期待はしているが・・・。
629:はちみつ餃子
18/09/21 23:41:33.16 FzfC+eZt0.net
>>611
なんでその結論に納得できるのに前提に色々言ってんだ?
テンプレートについてはそっちが言い始めたことで、別の話題だろ?
代用という言葉の使い方がちょっとずれてるだけじゃないの。
そのまま置き換えれるかという意味では代用できないし、
継承でなんとかしてたデザインをテンプレートを活用したデザインに置き換えられる (こともある)
という意味では代用ともいえる。
言葉については、「ダサい」はともかく、「風潮」に何か問題あるか? それは全くわからんな。
デザインの風潮というものは間違いなくある。
630:はちみつ餃子
18/09/22 00:00:10.67 cynlNZMd0.net
>>613
無理無理。
今だってろくでもない回りくどい仕組みでどうにかこうにか
型の制約を表現できてるってだけだもの。
初心者にそれを元にデザインさせるのは無理。
型の制約についての知見とは別に C++ の言語機能が足りてない。
631:デフォルトの名無しさん
18/09/22 00:04:20.29 0je8S2eS0.net
>テンプレートについてはそっちが言い始めたことで
ダサいとかイケてるとか風潮とかで設計を語るからだよ
お前の説明はだいぶ甘い、自分でよくわかってないものを押し付けてないか?
そういう傾向を指摘されたって気づいてるだろ?
自分のコーディングの経験が足りてないゆえに、はっきり断言できないから風潮とか出てくるんだろ?
さっさと謝ってりゃここまで言ってないんだがな
>デザインの風潮というものは間違いなくある。
そう思ってんのはお前らアマチュアだけだから。(特にお前の思ってるようなデザインについては)
>>617
何の話してんの?コンセプト?w
なんで初心者がまだ導入されてないコンセプト前提の設計しなきゃならないの?馬鹿なの?
コンセプト入ったら実行時のポリモーフィズムをテンプレートで出来るの????wwwwww
632:デフォルトの名無しさん
18/09/22 00:11:49.56 vYximTvP0.net
最初はもてはやされたけど、みんな知ってる前提になったら特に触れられもしなくなった
風潮ってこいうのだろw
633:デフォルトの名無しさん
18/09/22 00:12:42.81 0je8S2eS0.net
すまんちょっと熱くなりすぎた
論破されたことに気付かないアホ(あるいは謝ったら死ぬ病)相手にするとキリが無いわ・・・・
もうやめとく
634:デフォルトの名無しさん
18/09/22 01:40:05.82 3xdfFsZb0.net
権限の委譲というと良いものを与えているイメージだが
UML用語の委譲はどうみても仕事の丸投げとかたらい回しな印象であるイメージ
な気がする
635:572
18/09/22 02:14:06.30 3xdfFsZb0.net
昨日のプログラムを改良したったwwwww
URLリンク(ideone.com)
データ数N=300のときCore i7-860 (2.8 GHz)で8秒かかる。idoneのやつでも5秒。
N=1000だと宇宙の終わりまでかかる予定。
これで漏れも低学歴知恵遅れに晴れて仲間入りDA☆NE!
636:デフォルトの名無しさん
18/09/22 03:45:26.27 57qyxfm80.net
URLリンク(ideone.com)
高速化する話なのか低速化する話なのかは分からんけど、素直に書いたらこんな感じかなぁとか。
終わった話題かもしれんけど。
どうしても高速化したいんやったら、関数を並列実行できるようにして、
URLリンク(cpprefjp.github.io)
上記の数で分割実行かなぁとか。
フューチャー投げるのはそんなに難しくないと思う。std::async使えば簡単だし。
637:デフォルトの名無しさん
18/09/22 03:54:48.35 57qyxfm80.net
気が付いたら、absがテンプレート関数じゃなくなってた。
638:デフォルトの名無しさん
18/09/22 07:17:07.67 ieaomBGwa.net
constexprな関数はコンパイル時でも実行時でも使えるが、定数になる文脈とならない文脈で関数を使い分けしたい。そういう使い分けは可能だろうか?
例えばsqrt関数はconstexprになっていないが、
アルゴリズム的には自作関数でconstexpr対応可能
ただし速度的にはcmathのsqrtの方が何倍も早いのでconstexprでない文脈の時にはcmathのsqrtを呼び出したいのです。
639:デフォルトの名無しさん
18/09/22 07:58:27.87 0je8S2eS0.net
is_constexprで検索したらそれっぽいアイデアは出てくるけど
640:デフォルトの名無しさん
18/09/22 09:39:59.40 qCwQCuMG0.net
>>625
ビルド過程を見直せば?
バカみたいに何でもかんでもconstexprに頼る理由はない。
641:はちみつ餃子
18/09/22 12:24:16.36 cynlNZMd0.net
>>618
なんで実行時ポリモーフィズムの話なんか出てるんだ?
出来ないもんをやれなんて言ってないだろ。
関係ない要素をどんどん出してくるなよ。
何を言いたいんだ?
642:デフォルトの名無しさん
18/09/22 13:05:08.82 PHVB0Lj2M.net
templateで躓いてるんですけど皆どうやってテンプレートを勉強したんですか?
643:デフォルトの名無しさん
18/09/22 13:06:49.63 sAfENX6G0.net
車輪の再発明
644:デフォルトの名無しさん
18/09/22 13:16:51.91 EBMrcrP1a.net
何を悩んでる?
645:デフォルトの名無しさん
18/09/22 13:22:32.93 PHVB0Lj2M.net
>>631
Boostのテンプレートを読んでるのですが、理解できない点です
646:デフォルトの名無しさん
18/09/22 13:36:27.52 a9vdXzW90.net
>>632
まずはstlは一通り不自由なく使えるかな?
647:デフォルトの名無しさん
18/09/22 13:45:08.87 PHVB0Lj2M.net
>>633
はい、STLに関してはそれなりに使えます
648:はちみつ餃子
18/09/22 13:53:36.62 cynlNZMd0.net
>>632
Boost はかなり技巧的で無理やりなこともやるので、
ある程度 C++ をわかっている人でもまともに読めないこともある。
普通に入門書とかを読むところから始めるしかないんじゃね?
649:デフォルトの名無しさん
18/09/22 15:05:35.09 JTph0UBg0.net
boost読んでテンプレート勉強しようとするのは、IOCCCでCを勉強しようとするのと同じくらい無謀
650:デフォルトの名無しさん
18/09/22 23:16:14.20 Img386zI0.net
test
651:デフォルトの名無しさん
18/09/22 23:16:57.30 02eserMU0.net
アホ
652:デフォルトの名無しさん
18/09/23 00:42:54.42 cRG95Xcq0.net
boostのインチキくさそうなソケット通信とか使ってるヤツいんの
普通にsocket通信の関数で書いたほうが可読性が高そうで困る
653:デフォルトの名無しさん
18/09/23 01:28:26.89 MC3A3QT40.net
SG4に標準化提案はされてるみたいね
654:はちみつ餃子
18/09/23 03:10:01.78 SNhvYMGK0.net
>>639
Boost のことはよう知らんけど、
Boost の他のライブラリと組み合わせやすいとか、
そういう利点はないの?
655:デフォルトの名無しさん
18/09/23 09:37:53.48 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:デフォルトの名無しさん
18/09/23 11:39:09.69 A6XCmyXs0.net
std::rel_ops空間に == から != を、< から <= > >= を合成するテンプレートならあるけど
657:デフォルトの名無しさん
18/09/23 12:14:54.07 loi8GnJQ0.net
これとかに載ってなかったっけ?
URLリンク(www.amazon.co.jp)
658:デフォルトの名無しさん
18/09/23 14:13:03.08 oyuLVtOs0.net
detection idiomで検出してSFINAEで分岐させるだけでできそうだけど
659:デフォルトの名無しさん
18/09/23 14:26:07.42 Dpz6ufMn0.net
barton nackman trickやな
operator ==が定義されているかどうかの分岐はSFINAEいるんでちょっと複雑になりそうだけど
private継承する基底を選ぶような形にできるはず
660:デフォルトの名無しさん
18/09/23 16:41:12.46 d60j7qb90.net
そんなことができるざんすか。
めんどくさそうですな。
661:デフォルトの名無しさん
18/09/23 16:42:46.60 oyuLVtOs0.net
if constexprつかえばSFINAEいらんな
普段使えない環境だから出てこなかった・・・
662:デフォルトの名無しさん
18/09/23 17:06:46.21 LgC14Oo10.net
スフィ姉たまんねぇ
ていうか>>643見てnamespace rel_opsの定義見て考えたがSFINAE要らなくね?
コンパイラの挙動(関数名の解決規則?)として、
Tについてoperator==(const T& a, const T& b)そのものズバリが定義されていればそれが使われるし、
無ければその次以降にテンプレートを探しに行こうとするから、
そのときstd::rel_ops名前空間が導入されていれば勝手にテンプレートバージョンが使われる
というしくみっぽい?
663:デフォルトの名無しさん
18/09/23 17:18:52.49 oc2N8BDIM.net
>>632
バリバリのテンプレート使いいませんか?
テンプレート難し
664:デフォルトの名無しさん
18/09/23 17:45:10.35 oyuLVtOs0.net
>>649
あーたしかに
試してみたらいけた
665:デフォルトの名無しさん
18/09/23 17:58:10.59 Dpz6ufMn0.net
>>648
if constexprほとんど使ったことなかったけど便利だなー
確かに型で分岐する必要なかった
URLリンク(wandbox.org)
>>649
その方法だと、>>642で言ってるような特殊な補完を他のクラスにも適用することにならん?
それでもいいならいいけど
666:デフォルトの名無しさん
18/09/23 19:13:07.53 3hdlUg1R0.net
>>650
わかんないなら質問すればいいじゃん
何がわからないから分からないと本とかのおススメもできないだろ
667:デフォルトの名無しさん
18/09/23 21:11:00.27 ygIHva++9
URLリンク(ideone.com)
なぜデストラクタが2回呼ばれるのか分かりません。
理由を教えてください。
668:デフォルトの名無しさん
18/09/23 21:04:04.43 LgC14Oo10.net
>>652
>その方法だと、>>642で言ってるような特殊な補完を他のクラスにも適用することにならん?
ならない。ならずに済ませられることができる
補完する演算子のテンプレートの導入範囲を名前空間で限定すればおk↓↓↓
URLリンク(ideone.com)
21行目のOP_EQ_FOO_ENを定義してもしなくてもビルドが通り、Foo::operator==()の呼び出し回数を除き同じ結果になる。
ただし、operator==()についてはちょっぴり闇が深いことがわかった。
名前空間std::rel_opsにはoperator==()テンプレートが存在しない
上のサンプルではstd::rel_ops名前空間に無理矢理operator==()テンプレートを追加したが、
実際にやるときは独自の名前空間でoperator<()以外の全部(==、!=、>、<=、>=)を用意しておくことになるん
ジャマイカ
669:デフォルトの名無しさん
18/09/23 21:30:04.73 Dpz6ufMn0.net
あーすまん、目的を誤解してた
クラスのoperator ==の実装を省きたいんじゃなくて使う側で補完できればいいのか
670:デフォルトの名無しさん
18/09/24 00:24:52.05 rSek34EXa.net
5年くらい前?にテンプレートプログラミングっぽい趣旨の本があったし、基本情報に何故かPrologと同じジャンルにテンプレートが言語として載ってる辺り論理型言語っぽい事ができるみたいだが、基本C++の1機能でしか無いから、知ってる人は少ないんじゃ無い?
俺も知らない。
671:デフォルトの名無しさん
18/09/24 00:56:28.11 cIWp1XlU0.net
C++テンプレートテクニック 第2版、
επιστημη(えぴすてーめー)・高橋 晶、2014
C++ 標準化委員のεπιστημη の本だろ。
ドワンゴ江添亮も、需要があれば、こういう本を書きたいって言ってたけど
672:デフォルトの名無しさん
18/09/24 01:06:54.52 rSek34EXa.net
それそれ。
出来るっぽいってのは知ってても、実際できてる奴少ないと思われ。
673:デフォルトの名無しさん
18/09/24 01:14:19.28 Kxio7RVg0.net
テンプレート使うのに
いちいちそんな悩むもんなんか
なにかを参考にしたいようだが
たとえばtraits乱用してるようなのは読む必要も
674:ないし 逆にマネする必要がないわ
675:デフォルトの名無しさん
18/09/24 01:21:07.01 rSek34EXa.net
俺も気にした事ないけど、気になる奴は気になるんだろう。
俺の場合は整数型をどうやって文字列型にしてるんだ?ってのが疑問でむしろアセンブラに走って頭捻って理解した。
まあ人間そんなもん。
676:デフォルトの名無しさん
18/09/24 01:37:53.34 orHhPIQU0.net
テンプレートはC++の必須教養だと思ってるけど、別になくても困らないしな・・・
677:デフォルトの名無しさん
18/09/24 01:47:51.69 sBjtzBeV0.net
>>662
つ vc++ 1.x
こいつのテンプレートは泣ける
678:デフォルトの名無しさん
18/09/24 01:54:17.59 XuY/8j5Q0.net
>>657->>662
同感
はちみつと言い争ったときに
>>デザインの風潮というものは間違いなくある。
>そう思ってんのはお前らアマチュアだけだから。(特にお前の思ってるようなデザインについては)
とか書いたけど
実践ではなく仕様メインで覚えてる人(趣味でC++の知識を集めるのがメインの人であり、アマチュア)は
「これからの時代はテンプレート使った総称的プログラミングが主流」
みたいなパラダイムの変化を訴えてるけど、それはっきり言って素人が見れるコードでだけだから・・・
(C++標準ライブラリやBoost等)
テンプレート使ってとことん汎用性を高めたライブラリなんか、普通のソフト開発の現場では使われんわ
あまりにも時間がかかりすぎる
そういうごくごく一部の偏ったソースしか読んだことないから誤解するんだろう
で、その誤解した趣味グラマのネット上の言説やライターが書いた本を読んで、
初心者がC++に挫折して去っていくという・・・・・
C++なんか最初はベターCでいいんだよはっきり言って
あと最近ネット見てて(C++の)オブジェクト指向とかC時代の古いノウハウの解説が少ないのは、
単にとっくに出尽くしたからだからな、最近始めたやつは誤解したらだめよ
679:デフォルトの名無しさん
18/09/24 02:00:05.34 XuY/8j5Q0.net
訂正
Xテンプレート使ってとことん汎用性を高めたライブラリなんか
○テンプレート使ってとことん汎用性を高める開発手法なんか
680:はちみつ餃子
18/09/24 02:14:19.64 tUW1+gfS0.net
>>664
「何もかもを継承構造で解決しようとするな」の
ひとつとしてテンプレート (を C++ なら利用することになるプロトコル指向的デザイン) が出たんだし、
C++ にコンセプトの概念を持ち込もうとする機運があるほどには活用比率も高まるだろう、という程度の主張なのに、
「とことん汎用性を持たせるべき」とか「主流になる」みたいな拡大解釈はやめてくれよ。
俺はそんなこと主張してないからね!
681:デフォルトの名無しさん
18/09/24 02:32:05.77 XuY/8j5Q0.net
>>666
しつこいぞ
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって
「おかしな流行が発生して初心者を惑わした」、に対して反論したんだろ?嘘つくなよ
>俺はそんなこと主張してないからね!
主流になる、って意味だろ?これ↓
>C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
ちなみに
>コンセプトの概念を持ち込もうとする機運
コンセプトは標準化委員会や禿が言い出したことだぞ
導入されたら素晴らしいとは思うが、元々はテンプレートを使ったコードのエラーメッセージをどうにかすることと
テンプレートパラメータで満たすべき要件をコメントではなくコードで示せるようにすることだ
プロトコル指向は聞いたことないが、それはコンセプトで可能になるおまけ程度だろ
しかもそれを利用するにはテンプレート必須なわけで、コンセプトが入ろうが、
クラスなどが実際どういう仕組みなのか程度のことは把握してないと、初心者が手を出せるようなものではないし
出させるべきでもない
682:はちみつ餃子
18/09/24 02:45:26.39 tUW1+gfS0.net
>>667
変な (教え方なり使い方なりが下手くそな) 流行があったということを以て
テンプレートの活用を全否定するような言い分に反論したんだよ。
テンプレートが無くて良いと思ってるわけじゃないんだろ?
> 主流になる、って意味だろ?
今までが継承構造に頼りすぎだったのが是正されるという意味だ。
初心者への教え方については、また別の話。
ベターCからで良いという意味のことは D&E にも書かれてる基礎理念だから
そこは疑ってない。
683:デフォルトの名無しさん
18/09/24 02:59:37.96 XuY/8j5Q0.net
>テンプレートの活用を全否定するような言い分に反論したんだよ。
>>587と>>588を100回読み直せボケが
悪いけど、お前まともにメタプログラミングやってないだろ?
まともに活用して利点・欠点をはっきりわかってないやつが何偉そうに語ってんの?
しかもその理由で反論したんなら、なおさらポリモーフィズムの話で論破されただろ、
なんで認めずに自分の主張の意味を途中から変えてまで言い返してんの?
図星突かれて気分が悪いってか?
>今までが継承構造に頼りすぎだったのが是正される
誰が頼りすぎてたの??今までっていつまで?
>初心者への教え方については、また別の話
今まで何度も「こいつ初心者にテンプレート勧めてるよ・・・・何考えてんだ」と思ってたんですが
どの口で言ってんだ
684:はちみつ餃子
18/09/24 03:17:34.86 tUW1+gfS0.net
>>669
ポリモーフィズムの話ってなんだ?
初心者へじゃなくて、
君に、テンプレートの話はしてたつもりだが。
(ID 変わってるから他の人だったらスマソ)
他の人にアンカーを付けてテンプレートの話はしてないだろう。
685:はちみつ餃子
18/09/24 03:38:10.37 tUW1+gfS0.net
>>669
> 誰が頼りすぎてたの??
標準ライブラリすら。
その他はまあ、私の実感なので、違うというなら違うのかもしれない。
686:はちみつ餃子
18/09/24 03:48:16.31 tUW1+gfS0.net
「美味しんぼには我慢ならん」
「おい、辛抱しろ」
687:はちみつ餃子
18/09/24 03:48:58.75 tUW1+gfS0.net
誤爆した。 ごめん。
688:デフォルトの名無しさん
18/09/24 09:51:46.55 dKKNaNpJ0.net
本当にテンプレートが必要なものってだいたいSTLに揃ってる印象。
あとはTBBみたいにある程度低いレイヤーの抽象化ではどうしても必要にはなる。
しかしこの種類のライブラリってのは本当に信用できる奴が作ったもの以外は
使いたくねーんだわ。
めちゃくちゃデバッグコスト高いからね。
そういう意味で一般プログラマーが実装するってのは実践的ではない。
689:デフォルトの名無しさん
18/09/24 10:18:16.36 cpSL59m30.net
テンプレートは型の定義をすり替えるために使うもの
#ifdefで型切り替える方がもっと糞だからそこはテンプレートにするべき
それ以上の凝った事はしないほうがいいね
690:デフォルトの名無しさん
18/09/24 11:22:17.38 GIs1tf8Y0.net
頼りすぎつーか逆だと思うぜ
コンテナの要件なんかインターフェイスにすればすっきりするのに
紙マニュアル(pdf含む)でガタガタ書かれた口約束とかすげーイヤ
歴史的に見てもそれをやるのに充分な言語機能がもうあったのに
691:はちみつ餃子
18/09/24 11:36:08.69 tUW1+gfS0.net
>>676
現状の C++ では型の制約を表すには意味不明な SFINAE で回りくどくやってて
初心者には使いこなせない (中級者でも不安があったり面倒だったりする)
という話の文脈だから、言語機能が充分だというのはちょっと変な立場だ。
692:デフォルトの名無しさん
18/09/24 11:43:09.69 IXp/Ejzw0.net
どうーがんばっても停止性問題は機械的に解けないケースを無くせないのだから
プログラミング自体をアルゴリズム化する企てはどこかで行き詰る
藻前らは行き詰まりかたの良し悪しを議論しているにすぎないのだガハハハハハハ
693:はちみつ餃子
18/09/24 11:47:19.43 tUW1+gfS0.net
>>676-677
ひょっとして抽象クラスでやったらいいという話だろうか。
Java とかから来た人はそういうことをやりがちだけど、 C++ の設計理念からすると、
少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う。
694:デフォルトの名無しさん
18/09/24 12:24:10.58 GIs1tf8Y0.net
>>679
動的結合のコストは関数ポインタなみにはっきりしてるだろ
695:デフォルトの名無しさん
18/09/24 12:28:24.97 cpSL59m30.net
インターフェース(=データメンバーなし抽象クラス)は静的な型の制約を表現できないからダメ
696:デフォルトの名無しさん
18/09/24 12:58:55.73 XuY/8j5Q0.net
>>679
>C++ の設計理念からすると、
>少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う
滅茶苦茶言うな
URLリンク(cpplover.blogspot.com)
>>674
ついでに開発コストも高い
STLが優れてるのは、作者が長年コンテナについて熟考に熟考を重ねたライブラリだからであって
それを実現するためにテンプレートが使われたに過ぎない
テンプレート使ってりゃなんでも有用なライブラリになると勘違いしてるアホが増えた
697:デフォルトの名無しさん
18/09/24 13:04:35.46 B4Me2M7J0.net
テンプレートは即席麺的な発想でライブラリのような寝かして熟成させるワイン的な使い方には向いていない
698:デフォルトの名無しさん
18/09/24 13:10:53.22 IXp/Ejzw0.net
インターフェースはあらゆるメソッドを最初から詰め込まねばならないからイヤソ(特に単一継承の場合
お禿様も自著でそういう傾向(あらゆるメソッドが基底クラスに集中する傾向があることをこっそりカミングアウトしていたはず
テンプレートにはそういう制約がない
型引数Tにadd()メソッドがあるものとしてテンプレートを書いたら、add()メソッドがある既存クラス全部にそのテンプレートが使える
というわけで、インターフェースはそれ自体静的な型の制約のつもりなのかもしれんが、
真にかけたい制約(上の例でいうとadd()メソッドの存在だけを問題にしたいケース)に対して不必要に過剰になることが多いキモス
あとインターフェースだとコンテナの実現は具体的にはどうするんじゃ…
仮想関数テーブル参照の実行時コストだけでも許容し難いのに、間接参照がさらに必要になるんじゃ…
699:デフォルトの名無しさん
18/09/24 13:22:48.05 GIs1tf8Y0.net
インターフェイスを単一継承前提で考えるって、どんな教育を受けるとそうなるのかな
numeric_limits<uintmax_t>::max()歩譲って単一継承ってことにしても
最初から全部詰め込みなんてハメにはあまりならないし
あらゆるメソッドが基底クラスに集中するなんて事例あるか?
俺は空想論だと断言するぞ
Smalltalkのobjectみたいなクラスに何が置けるんだよ
あと、なんか仮想テーブルのコストが云々いってるやつが複数いるようだが
具体的にどのくらいか、せめてオーダーくらいわかっているのか
700:デフォルトの名無しさん
18/09/24 13:35:23.36 cpSL59m30.net
オーダーの問題じゃなくて、C++にはゼロオーバーヘッドの原則があるんだから
ゼロオーバーヘッドに出来るものはゼロオーバーヘッドにするんだよ、標準はその手本なんだから
それにオーダーなんか処理内容でなんぼでも変わるだろ
せいぜい数十万要素のコンテナしか使わないプログラムだから仮想テーブルなんかどうでもいいと主張する奴の言うことは正しいかもしれないが
数兆個の要素を扱う人にはそんなもの慰めにならん
701:デフォルトの名無しさん
18/09/24 13:56:47.91 IXp/Ejzw0.net
>>685
>インターフェイスを単一継承前提で考えるって、どんな教育を受けるとそうなるのかな
型に対する静的制約を実現するにあたり、多重継承は助けにならないからですだが…
>あらゆるメソッドが基底クラスに集中するなんて事例あるか?
上とまとめて理由を述べる
今、add()メソッドを備えるインターフェースA、sub()メソッドを備えるインターフェースBがあったとして、
加減算ができる具象クラスDやEは、それぞれAとBを多重継承したら一応はできる ・・・(1)
しかし、このバージョンのDやEは「加減算ができるクラス」という静的制約を満たしているとは言えない
なぜなら、DとEは全く別のクラス扱いになるから、DとEを共通に扱える関数を書けないので…
「加減算ができるクラス」という制約の正しい書き方は、AとBを継承するインターフェースCを定義して、
DやEにCを継承させる(単一継承)とらざるおえない ・・・(2)
なおいうまでもないことだがテンプレートにはそんな制限は無い。(1)のバージョンのD、Eに対して
問題なく「加減算ができるクラス」という制約をかけられる(Cにメソッドを集中させる必要が一切ナッシング
702:デフォルトの名無しさん
18/09/24 14:02:13.87 IXp/Ejzw0.net
ていうか最後の2行で筆が滑ったorz
テンプレートで「加減算ができるクラス」という制約をかけるにはインターフェースA、Bもそもそも要らん
スゲー便利
703:デフォルトの名無しさん
18/09/24 14:25:40.72 yuMzZsdXa.net
templateはダックタイピングだとおもう
704:はちみつ餃子
18/09/24 15:09:08.71 tUW1+gfS0.net
どう説明したもんかと思ったけど、 >>684 の説明が分かりやすいな。
(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
全体のデザインが定まらない。
関数が要求する性質 (インターフェイス) が増えた時に元の定義をいじるか、
mixin のような形で継承関係を作ることになる。
ちょっと機能を増やすだけでいらん継承関係を作るのは良くないという話の延長線上で
考えればインターフェイスを使ったところであまり解決にならない。
型制約 (コンセプト) は関数の側に付加するものなので、後付けが簡単だ。
結果的に型の側はその性質を持たなきゃならないことにはかわりないが、
性質を追加するのに元のクラス定義を弄らなくて済む。
-----------
最初の設計がキッチリしてたら、
クラス指向的なスタイルの方が混乱が少なくて良いかもしれないなと思い始めてきた。
でも、現実にはそうではない後付けだらけじゃん? とも思ってるわけ。
705:デフォルトの名無しさん
18/09/24 15:15:20.89 GIs1tf8Y0.net
>>687
型に対する性的制約って何?
それと事例あるか?と聞いている質問に何で長文がいるんだよ
具体的なライブラリとクラス名を挙げるだけだろうが
なるべく知名度の高い事例ほど説得力があるぞ
706:デフォルトの名無しさん
18/09/24 15:32:49.32 XuY/8j5Q0.net
>>690
コンセプトを盲信しすぎだろ
あくまで要件をコードで示せるだけだっての
それこそSTLには必ず導入されるべきものだけど、そのSTLでの不満、
つまりInputIteratorだのなんだのの要件をいちいちリファレンス参照しないとわからなかった(>>676)から
必要とされたわけで
はちみつとかは多分STLべったりで、それ以外のライブラリを読んだり
まともにソフト書いたことないから、STLがほとんど出てこない状況ってのを経験してないんだろ
>ちょっと機能を増やすだけでいらん継承関係を作るのは良くないという話の延長線上で考えれば
話を広げすぎ。
型の制約という意味でいえば、現状コンセプトを待つしかないが
多分>>685が言ってるのは、Modern C++ Designで言うところのポリシークラスみたいな話じゃね?(違うかもしれんけど
この場合はあくまで要件定義なので当てはまらないと思うけど、
>いらん継承関係を作るのは良くない
これは暴言。Andrei Alexandrescuに言ってくれば?
ポリシークラスのような、継承によって機能を取り込む設計も非常に便利だし、それこそSTLでもあちこちで使われてるんだがww
あと後半チラ裏にも程がある。何様だよ
707:デフォルトの名無しさん
18/09/24 15:33:05.07 cpSL59m30.net
Container<T>のbegin()が返すのはIterator<T>だとか
Matrix<M,N>とVector<K>はN==Kのときだけ掛け算できて結果はVector<M>だとか
Converter<V,W>とQueue<X>とProcessor<Y,Z>を持ってたらWとXとYはコンパチブルじゃなきゃいけないとか
そういうのが型の静的制約
708:デフォルトの名無しさん
18/09/24 15:39:44.60 GIs1tf8Y0.net
へーえ、vector<int>とvector<string>が掛け算できないという制約が
pure virtualを使った途端に無法状態になってしまうのか
709:デフォルトの名無しさん
18/09/24 16:03:46.76 cpSL59m30.net
じゃあ練習問題だ
IntVector::begin()の戻り値はIntIteratorで、IntIterator::value()はintを返す
StringVector::begin()はStringIteratorで、StringIterator::value()はstringを返す
そういう制約を表現するインターフェースIVectorを具体的に書いてみよう!
出来やしないのは手を動かせばすぐわかる
710:デフォルトの名無しさん
18/09/24 16:06:21.46 cpSL59m30.net
ああこれだけだと出来ちゃうか
end()もあってbegin()と同じ型のイテレーターを返すっていう制約も付けてちょうだい
711:デフォルトの名無しさん
18/09/24 16:08:34.73 GIs1tf8Y0.net
#define interface struct
template <typename T>
interface IVector
{
class iterator;
virtual iterator begin() const = 0;
};
712:はちみつ餃子
18/09/24 16:14:35.10 tUW1+gfS0.net
>>692
ポリシークラスは注入 (?) すべきポリシーをパラメタ化してるだけで、
何をパラメタにするかというデザインがきちんとしてれば有用だし、
いらん継承だとは思わないよ。
でも、現実には後になってそれがわかることもあるよねっていう話。
713:デフォルトの名無しさん
18/09/24 16:24:48.03 cpSL59m30.net
>>697
テンプレート使ってんじゃねえよ雑魚
714:デフォルトの名無しさん
18/09/24 16:34:08.72 GIs1tf8Y0.net
>>699
は? 後出しで言い訳してんじゃねえよ蛸助
インターフェイスがテンプレートになってる実例をまさか知らんのか?w
715:デフォルトの名無しさん
18/09/24 16:37:21.35 cpSL59m30.net
お前の主張通り継承で全部やれよ
そういう所が雑魚なんだよw
716:デフォルトの名無しさん
18/09/24 16:38:54.75 GIs1tf8Y0.net
捨て台詞吐いて逃亡かw
追わねえよくっだらねえ
717:デフォルトの名無しさん
18/09/24 16:41:06.83 cpSL59m30.net
そっくりそのままお返ししますわw
テンプレートと継承の出来ることと出来ないことの区別がつくまで二度と下らない妄言吐くなよ
718:デフォルトの名無しさん
18/09/24 17:18:02.91 XuY/8j5Q0.net
>>698
>現実には後になってそれがわかることも
それは
>何をパラメタにするかというデザインがきちんとしてれば
が後で変更になることもある、ってことだろうけど
そこまでの変更があったら、結局元の定義に手を出さなきゃいけないのは
どんな設計でも同じことだと思うけどなぁ
>性質を追加するのに元のクラス定義を弄らなくて済む
と言ってたが、それは結局関数とかでクラスの要件を必要以上に大きくしないように
例えばallocator_traitsみたいに、色々手間をかけて、利用するクラスへの依存を減らすのと同じじゃね?
俺にはそういうイメージしか沸かないんだが
コンセプトマップってそういうことだろ
結局テンプレートであれこれ書くことになるか、コンセプトマップであれこれ書くことになるか、ってだけ
(=開発コストは高い)
std::vectorだって、例えばアロケータは初期化時に渡さないといけないし
コピーとかしたときにアロケータはコピーしてくれなかったと思うが
それが不便だという声もある(ここでたまに取り上げられるEASTLの開発動機で触れられてる
あと、アロケータは型に依存するけど、メモリ確保なんてのはそもそも型は関係ないので
アロケータのあの設計は失敗かもね、というのもある(同じくEASTLでも触れられてる
それに対する代替案として、上で挙げたstd::pmr::memory_resourceが出てきたわけだけど、
今更STLの基本設計は変えられないのでpolymorphic_allocatorでラップするということになった
もしvectorがポリシークラスを受け取って、アロケータやメモリ管理についてもっと汎用化してたら
こういう問題は起きなかった(クッソ複雑になってるだろうけど)
これコンセプトでどうにかなるか?後になってわかってもどうにもならんよ
719:デフォルトの名無しさん
18/09/24 17:46:45.01 yIbiTIWcr.net
ヒープ領域にインスタンスを作りたいときってどうしてもポインタを意識しないとダメなの?
MyClass abc;
みたいに宣言したいんだが。
MyClass* abc;
abc = new MyClass;
みたいにするしか方法ないの?
ヒープに作りたい理由は、巨大なオブジェクトだから。
ちなみにスマートポインタは使えない (icpc 12.0.4)。
720:デフォルトの名無しさん
18/09/24 17:53:54.47 CvpxIDb80.net
コンパイラに指示できるか、という意味ではないよ
そんなのあったも紛らわしいだけだと思うけど
721:デフォルトの名無しさん
18/09/24 18:26:32.41 sIOpRstjM.net
>>705
MyClass& abc = *new MyClass;
でいけるかも知らんけど十中八九delete忘れるし後から見て分かりにくいだけだから俺ならやらない
722:デフォルトの名無しさん
18/09/24 18:31:59.03 cpSL59m30.net
struct MyClassHolder
{
MyClass* p;
MyClassHolder(): p(new MyClass()){}
~ MyClassHolder(){delete p;}
};
とか作っとけばいいんじゃない
自分でスマポ書いてるのと同じだけど
723:デフォルトの名無しさん
18/09/24 18:47:38.62 yIbiTIWcr.net
>>708
ありがとうございます。
参考にします。
ちなみにポインタをどうこうしたくない理由は、これまで MyClass のインスタンスを参照渡しするように作っていた関数を、できるだけ変更したくないからです。
参照渡しをポインタ渡しに変えて、関数内に適宜アスタリスクを挿入するだけですか? 考えるのもしんどいです。
724:はちみつ餃子
18/09/24 18:55:55.79 tUW1+gfS0.net
>>704
> 色々手間をかけて、利用するクラスへの依存を減らすのと同じじゃね?
その通りだよ。
プロトコル指向でいうプロトコルは C++ で言うならまさにトレイツに相当すると思う。
(C++ では実装を直接的に強制する方法ではないけど。)
継承構造ではなく性質でジェネリック関数を使うってだけ。
継承で表すよりも性質で表現する方がたぶん記述は細分化されることになるので、
それが手間かもしれないし、
関連するものがとっちらかる感じはあると思う。
だけど「こういう型」というよりは「こういう性質」という方がプログラムが分かりやすくない?
既に述べたように拡張が楽というのもある。
ただ、プロトコル指向的デザインでは機能を追加することは出来ても
既に問題が生じているものをスパッと綺麗に解決できるわけではないので、
いつでも元の定義を弄らずに済むほど万能とはさすがに言わないよ。
vector なんてそれこそ達人たちが検証してるだろうから、
私が思いつくようなことが入り込む余地は無いだろうし。
そこらへんは程度問題なので、積極的に (あるいは消極的に)
(テンプレートを用いた) プロトコル指向的デザインを
使うのが割に合わないという場面もそれなりに多くあると思う。
繰返すけど、そこまで万能と思ってるわけじゃない。
725:
18/09/24 19:02:18.61 63DR0NZS0.net
>>705
static 宣言する、というのはありな状況ですか?
static MyClass abc;
726:デフォルトの名無しさん
18/09/24 19:02:38.38 XuY/8j5Q0.net
こいつ金慶珠みたいなやっちゃな・・・・マジめんどくさい
727:デフォルトの名無しさん
18/09/24 19:04:43.22 XuY/8j5Q0.net
>>712は>>710宛
>>709
関数の方を変えなくても、渡すとこで
auto a = hoge(*pMyClass);
でいんじゃね?
それも大変なら>>708みたいにラップするしかないけど
728:デフォルトの名無しさん
18/09/24 19:14:36.90 yIbiTIWcr.net
>>711
オブジェクトのサイズが動的に変わるので、難しいです(合ってるかな?)
>>713
> 関数の方を変えなくても、渡すとこで
> auto a = hoge(*pMyClass);
> でいんじゃね?
> それも大変なら>>708みたいにラップするしかないけど
void hoge(MyClass abc);
なる関数 hoge() に、
MyClass* pabc;
pabc = new MyClass;
hoge(*pabc);
とする、ということですよね?
この方法では、関数呼び出し時にコピーコンストラクタが呼ばれますか?
それとも参照渡しのように、実体(?)が渡されるのでしょうか。
729:デフォルトの名無しさん
18/09/24 19:30:44.68 XuY/8j5Q0.net
>>714
呼ばれないよ
参照渡しと同じことになる
730:デフォルトの名無しさん
18/09/24 19:31:36.39 XuY/8j5Q0.net
あ、もちろん関数側の受け取りを参照のままにしてれば、だけどね
731:デフォルトの名無しさん
18/09/24 19:42:51.66 E4VB1fuR0.net
>>709
MyClass abc1;
foo(abc1);
MyClass* abc2 = new MyClass;
foo(*abc2);
delete abc2;
732:デフォルトの名無しさん
18/09/24 19:44:00.35 E4VB1fuR0.net
あっ、既に出てたわ
733:デフォルトの名無しさん
18/09/24 19:51:26.90 yIbiTIWcr.net
>>715-718
すみません。
>>714は間違っていますね。
hoge() の定義は
void hoge(MyClass& abc);
でした。
ありがとうございます。
提案していただいた方法なら、関数側はほぼ何も変えないでできそうです。
初歩的な質問に付き合っていただき感謝します。
734:デフォルトの名無しさん
18/09/24 20:06:20.22 I/nCcJf20.net
URLリンク(ideone.com)
上から取れないマウントを取りに行くスタイル。
735:デフォルトの名無しさん
18/09/24 20:23:29.03 SA5x5JnZ0.net
ボレロ村上さんや江添さんみたいなプログラマーになりたいんですが、彼等はどうやってC++についてあんなに詳しいのでしょうか?
736:デフォルトの名無しさん
18/09/24 20:29:49.13 I/nCcJf20.net
どっちも早いころからパソコンを触っており、
早期にはこんなに言語がなく血反吐吐いて低級言語を覚える必要が少しあり、今はその応用で食ってける。
C/C++も今ほどライブラリがなく、自作するか引っ張ってくるしかなかったうえにそもそもコード系のシャルネットワークがなかった。
737:デフォルトの名無しさん
18/09/24 20:40:24.56 dKKNaNpJ0.net
前提として奴らは別にプログラマーとして有名なわけではない。
コードを書く能力と有名なことが反比例しているわけだがそれでもいいなら
彼らの真似事してれば同じようになれるんじゃね?
738:デフォルトの名無しさん
18/09/24 20:50:32.86 I/nCcJf20.net
まぁ、名前を聞くようになったのはツイッターあたりからやね。
江添氏はコードのお作法がおかしいと食いついたりしてたし、委員会に近いところにいたのでそういう情報を発していた。
けど、個人ではあまりコードは書いてないみたいだな。
ボレロ氏は高専言いっててそこらへんで色々学んでconstexprライブラリで名前を売ったってところはある。
その後縮小して最近コードを書いているという話は聞いてないような。
どっちも有名になったのはこの世の不満とオタクの人権みたいなのを発していたら有名になったってところはある。と思ってる。
739:デフォルトの名無しさん
18/09/24 21:16:51.40 GIs1tf8Y0.net
誰にでもウイークポイントはある
そこを苛める遊びに固執する阿呆は誰からも何も学べないまま
自らがウイークポイントのみからなるコンパクト星として成長するのみ
世の中の誰からも軽蔑しか受けない天涯孤独な存在だ
740:デフォルトの名無しさん
18/09/24 21:32:17.37 XuY/8j5Q0.net
まぁ江添氏は委員会の人間だしコードあんま書いてなくても日本のC++ユーザーのために
仕様の解説してくれてるしね
ボレロ氏は・・・まぁその・・・・・生産性あるんだか無いんだかよくわからんライブラリ作ってるというか
あれはあれで勉強になるけど・・・・w
ただ初心者が「ああなりたい」ってよく言ってるのは理解に苦しむな
中途半端な知識でドヤ顔するのでなく、真摯に解説するサイトでも作ってくれりゃ価値があるけど
個人的には彼らを崇拝する人を見るたびに、もやもやした気分になる
言語は道具なんだから使ってなんぼやろ・・・
741:デフォルトの名無しさん
18/09/24 21:37:21.19 SA5x5JnZ0.net
>>726
まあ結局言語は道具といっても、作ったものが革新性があったり、真似できないようなら人気を集めるような気がするんだよね
東方のZUNとか別にそこまで凄いゲームでもないけど、プログラマーとしてそこそこ尊敬されてる
742:デフォルトの名無しさん
18/09/24 21:59:39.82 dKKNaNpJ0.net
仕事でコード書いてたらc++の最新の仕様を追えないからやらない
とか本気で言ってしまう奴は根本が腐ってると思うよ。
言ってて矛盾を感じないのかと。
743:デフォルトの名無しさん
18/09/24 22:02:16.29 orHhPIQU0.net
目標が名声なのか、C++理解度なのか・・・
粛々とコード書き続けるのが一番
744:デフォルトの名無しさん
18/09/24 22:40:40.71 SA5x5JnZ0.net
>>729
もちろん理解度なんだけど、何となく日本以外だと彼らしか目標とする人物が見つからなくて
745:デフォルトの名無しさん
18/09/24 22:55:21.63 CvpxIDb80.net
ISO/IEC読んでworking draft読んでおまけにg++/clangの実装で読んで
それでみんが知らなそうな重箱をつつくような仕様拾ってきてブログのネタに
すればいいんでないの?知らんけど
746:デフォルトの名無しさん
18/09/24 22:59:57.25 XuY/8j5Q0.net
まぁ日本だと、解説サイトで目につく人ってそんなもんか
ZUN氏挙げるのははちょっと不思議だけど・・・
以前東方に使われてる技術の解説がどこかにあったけど、
タスクシステムみたいな古くからある2Dシューティングの常套手段とかしか記憶にない
(なんか驚くようなのもあったかもしれんけど
仕事で書いてると驚くようなコードとか設計をあちこちで見かけるけど、
そういうの書くのはやっぱ誰も知らない無名の職業プログラマだったりするよ
747:デフォルトの名無しさん
18/09/24 23:31:07.79 nTOSaHPIH.net
>>732
今も�
748:サういう夢いっぱいな話あるの? 昔のファミコンソフトがスーパーテクニックの塊だった、みたいな 最近はリソースが潤沢にあって、手抜きのとりあえず動くプログラムが蔓延しているのだと思ってた
749:デフォルトの名無しさん
18/09/24 23:43:30.13 CvpxIDb80.net
今でもゲーム系はスーパーテクニック満載でしょ
マルチコアCPUを90%以上使い倒す世界だからな、すげーわ
750:デフォルトの名無しさん
18/09/24 23:47:03.19 XuY/8j5Q0.net
>>733
自分は半端者なんで知識はアレだけど、GTAシリーズとかEAのゲームとか
ああいうのは今でもリソース必死に使い切ってるみたいよ
(Game Programming Gemsとか読んでみたらその片鱗が見える)
スーファミ時代のような変態的なのとは方向性が違ってきてるけど
大規模な開発の上でいかにパフォーマンス損なわずに開発効率を上げるかが重視されてる
もちろん2Dのスマホゲーだったら全然使い切る必要ないだろうけど、そっち方面は詳しくない
(多分言語もC#かSwiftが主流?移植性考えたらC#だろうな
751:デフォルトの名無しさん
18/09/25 00:00:26.48 C9Mx85q+H.net
へぇ~~~面白い
「どの業界は超人多い」みたいのあるんだろうか
752:デフォルトの名無しさん
18/09/25 00:05:28.27 bpDEi/Vx0.net
個人的にはF-35のソースが読んでみたいw
753:デフォルトの名無しさん
18/09/25 06:17:40.32 NMIb1H0N0.net
>>737
さすがにF35のソースは見たことないけど、軍事関係や命に関わるコードはむしろ枯れた技術以外使わないんじゃないかな?
ECUとかはとんでもなく古い考え方(ほぼ全ての変数がグローバル)で作られてるし。
まぁECUの場合それはそれでちゃんと理由があるんだけどね。
754:デフォルトの名無しさん
18/09/25 06:26:38.28 cr5GGQ8dr.net
多次元配列クラス Tensor があるとして、そのインスタンス a は a[2][5][3] のように要素アクセスできるとします。
unique_ptr<Tensor> pa(new Tensor);
のように Tensor のスマートポインタを作った場合、pa の指してる Tensor への要素アクセスってどうやるのでしょうか。
「Tensor」の設計の詳細が必要であれば、boost の multi_array と同じとしていただいて問題ありません。
755:デフォルトの名無しさん
18/09/25 07:37:41.21 ovBx3cXW0.net
(*pa)[2][5][3]
756:デフォルトの名無しさん
18/09/25 08:18:12.28 fJAN4SxzM.net
>>732
自分は業務でC++使ってないのでそういう経験ができないのです‥
だからこそネットで活動してる人しか分からなくて‥
C++は全て独学するしかなくて、いい方法が無いかずっと考えてるのですが、結局ネットや本を見るしかなかったです
757:デフォルトの名無しさん
18/09/25 12:20:54.85 h/rPVSH9r.net
>>740
すみません……
いろんなところにアスタリスクつけたり矢印つけたりしてみたのですが、そのパターンは見落としてました……
758:デフォルトの名無しさん
18/09/25 12:31:36.38 HAbRzuEs0.net
>>742
見落とすというか……
予め正解を知っておかないと思い付くのは難しいかもしれない
そしてC++ではなくC言語的な原始的なポインタの話になるので、C++の教科書にそこまで詳しく載ってるかと言うと……
URLリンク(d.hatena.ne.jp)
URLリンク(www.nurs.or.jp)
URLリンク(tecmemo.wpblog.jp)
URLリンク(www7b.biglobe.ne.jp)
759:デフォルトの名無しさん
18/09/25 13:46:02.72 rTSM83rL0.net
>>738
組み込み系のノウハウなんだろうけど、大規模な組み込みってなってくると
一体どんな英知が詰まってるのかなーとか気になって
数百万行とかじゃなかったっけ・・
まぁMISRA-C++嫁、で終わる話かもしれんけどw
>>741
自分も会社入る前とか、辞めて休業中は全部独学よ
C++の知識だけに留まらず、何か作りたいもの作ってれば、
その分野での知識が嫌でもついてくると思う
C++の知識だけに閉じこもって実際の開発(プロじゃなくて個人のフリーソフトでも)と
乖離した方向に行ってしまうのが一番怖い
760:デフォルトの名無しさん
18/09/25 13:48:52.76 rTSM83rL0.net
そういえば以前ここで似たようなこと言ったら
「愚者は経験に学び、賢者は歴史に学ぶ」とか言われたなw
ああいうアホになるんだよ、言語の知識だけに閉じこもって何も開発せずにいると
761:デフォルトの名無しさん
18/09/25 20:49:31.31 ovBx3cXW0.net
人は繰り返し、神は再帰する
762:デフォルトの名無しさん
18/09/25 21:21:29.13 CZcrESgD0.net
>>744
>MISRA-C++
そんなものがあるのですか?
763:デフォルトの名無しさん
18/09/25 21:28:11.49 LXnmrKE+0.net
>>747
ggrks
764:デフォルトの名無しさん
18/09/25 22:53:16.70 uqsQEMjV0.net
>>690
>(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
>全体のデザインが定まらない。
無いメソッドを呼べる言語は存在しないからこれは仕方が無い(ジャバに限らん
ジャバに限らずインターフェースには利用者が絶対呼ぶメソッドだけではなく、
呼ぶかもしれないメソッドも全部packing listに入れねばならない点が無駄が大きい
その代わり、インターフェースのメソッドはビルド単位内で一意な名前(インターフェース名)で
(直接的あるいは間接的に)修飾されるから、同じメソッド名で違う機能のやつがあっても
衝突せず、安全性が保たれる
テンプレートはこの点だけがちょっと劣る
これ以外にテンプレートに欠点など無i
765:デフォルトの名無しさん
18/09/26 00:16:16.58 XAX5fYE80.net
バイナリインターフェースが重要なシステムもあるわけで
766:デフォルトの名無しさん
18/09/26 13:25:47.21 3bFkpdGnM.net
C++とシェルスクリプトの違いって何ですか?
シェルスクリプトで出来ることでC++ができないこと
C++が出来てシェルスクリプトで出来ないこととかそういう具体例を教えてほしいです。
767:デフォルトの名無しさん
18/09/26 13:28:14.24 3bFkpdGnM.net
>>751
個人的に上げるとしたら、webのフロントエンド分野はインタプリタに勝てないと思います
768:デフォルトの名無しさん
18/09/26 13:35:28.26 8zK/b6uE0.net
比較の対象が違い杉
769:さまよえる蟻人間
18/09/26 13:35:54.34 NuaJwewid.net
>>751
C++はコンパイルしないと動かない。シェルスクリプトはファイルの操作やバッチ処理が得意。
770:デフォルトの名無しさん
18/09/26 14:01:36.87 3yW6iUgn0.net
>>751
デバドラをスクリプトで書いてみてくれ
771:デフォルトの名無しさん
18/09/26 14:29:30.26 lYIfIhjTx.net
>>751
桃白白とラウチェン、マジンガーZとテコンVぐらい違う。
772:デフォルトの名無しさん
18/09/26 14:43:50.80 zEt8XtGI0.net
>>751
GUI使ったアプリはシェルスクリプトでは無理
773:デフォルトの名無しさん
18/09/26 14:51:55.15 3bFkpdGnM.net
>>754
確かにファイルの操作はそうですね
>>755
確かにそういう分野はCですね
>>756
例えが古くてパッとしませんでした‥
>>757
確かにOSにインストールするものはそうですね
774:デフォルトの名無しさん
18/09/26 15:12:38.31 nKPhFdqbH.net
C++というかオブジェクト指向の質問かもしれないんですけど
エクセルにデータを書き出すためのクラスがありましてメソッドがざっとこんな感じ
・データをファイルから読み込む
・シート作成(ここで以下のメソッドを呼び出す)
・シートAに書き出す
・シートBに書き出す
︙
・シートEに書き出す
全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
ただ正直あまり意味が無いような気もするんですよ。クラスと言うには小さすぎるものになりそうですし。
何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
775:デフォルトの名無しさん
18/09/26 15:23:36.10 dRFURWqC0.net
それは単に
メソッド シート作成(){
シートAに書き出す
シートBに書き出す
︙
シートEに書き出す
}
ということ?それとも
class A {
メソッド シート作成(){
シートAに書き出す
}
class B {
メソッド シート作成(){
シートBに書き出す
}
ということ?
前者ならクラス分ける意味がないと思うが。
776:デフォルトの名無しさん
18/09/26 15:33:15.98 3yW6iUgn0.net
>>757
Tcl/Tk の立場は?
777:デフォルトの名無しさん
18/09/26 19:56:11.35 oECBSnBC0.net
クラスは行数じゃなくて意味的にまとまってるかどうかだからな
意味のあるメンバがまとまってれば1万行の単一クラスがあってもいいし
デタラメに寄り集められた50行の粗大ゴミクラスもある
そういうもの
778:デフォルトの名無しさん
18/09/26 20:09:57.19 LRnZd7JJa.net
>>762
数字が逆じゃないか?
779:デフォルトの名無しさん
18/09/26 20:16:07.55 ME0063O80.net
>>759
>何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
ないよ
機能で分けれ
>例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
「書く内容を決める」機能が「シートに書く」機能を継承するなんてナンセンス
どのシートに書くかなんて「シートに書く」機能に引数で渡せばいいだけ
780:デフォルトの名無しさん
18/09/26 20:55:21.65 oECBSnBC0.net
>>763
あってるよ
50行でも粗大ゴミは作れちゃうんだよ
781:デフォルトの名無しさん
18/09/27 00:26:48.70 zZL/tnLy0.net
さすがに一万行でまとまってるクラスってのはないわ。。
782:デフォルトの名無しさん
18/09/27 00:28:50.85 pq96CSzd0.net
もしかして知恵遅れは
なんか書くために毎度毎度ofstreamを継承すんの
もしかして知恵遅れは
なんか読むために毎度毎度ifstreamを継承すんの
さすが
783:デフォルトの名無しさん
18/09/27 00:36:33.47 3iNJ0doV0.net
例えば、基本クラスに出力クラスを作って、
派生クラスに、プリンター・PDF など、機能が異なるならオブジェクト指向だけど、
機能が同じなら、派生クラスではない。
単に、属性・メンバ変数が変わるだけ
784:デフォルトの名無しさん
18/09/27 00:50:27.91 pq96CSzd0.net
void aho::write(ostream& aho) const {
aho << "aho" << endl;
aho << "baka" << endl;
aho << "manuke" << endl;
}
こんな感じで作っとけば
いろんなもんに書ける可能性がある
抽象化をうまく利用するというのは
こういうことだからな
785:デフォルトの名無しさん
18/09/27 05:39:28.23 DR3ASZ+QH.net
江添亮に匿名で質問ができて、高確率で答えが帰ってくる空間ってもうないのでしょうか
786:デフォルトの名無しさん
18/09/27 07:33:12.06 zZL/tnLy0.net
本人のtwitterにでも投げれば?
高確率で「質問ではない」が帰ってくるが。
787:デフォルトの名無しさん
18/09/27 07:58:37.31 GSDkLsyd0.net
>>751
シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
C++からならできる
つまりシェルスクリプトだけでは金輪際できない仕事というのは少なくとも1つある
もっともこの宇宙自体がシェルスクリプト上で走っているシミュレーションなら話は別やが…
788:デフォルトの名無しさん
18/09/27 08:51:58.83 Ct84HJ0d0.net
c++はコンパイラいるやろが
789:デフォルトの名無しさん
18/09/27 09:07:42.86 eHS6051wM.net
そんな規約あったっけ?
Cling とか CINT はパチモノ?
790:デフォルトの名無しさん
18/09/27 13:29:28.75 lX4OM9LG0.net
>>769
そういうのは、templateのほうがいい。ostreamに依存せずにすむ。
791:デフォルトの名無しさん
18/09/27 16:27:38.79 Zeo03I1R0.net
766からの流れでそうなっただけだろ
792:デフォルトの名無しさん
18/09/27 16:47:26.94 Oj9x/TA+0.net
俺には誰一人として標準のstreamクラスを継承する話はしてなかったように思えてならないんだが
(最初の>>759も書き出す処理を継承で共通部分と個別部分に分ける案を問うているだけ)
なんでそういう話になってるんだっけ
793:デフォルトの名無しさん
18/09/27 20:48:20.83 vb6QqVUs0.net
>>777
>>759
>全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
書き出す共通部をまとめたクラスというのは
ファイルで言えば ofstream みたいなものなのであろうと皆疑ってるんだろう。
「みたいなものではない」という、結論が違ってくるような違いも提示されないし。
794:デフォルトの名無しさん
18/09/27 20:54:25.22 /ZxE29S10.net
関数にすると不味いことある?
795:デフォルトの名無しさん
18/09/27 21:00:15.42 Oj9x/TA+0.net
>>778
そうなのか……ありがとう
俺はostreamを引数に取る関数オブジェクトを多態やprotectedを使って実装するみたいなイメージで読んでた
796:デフォルトの名無しさん
18/09/27 21:09:44.86 /ZxE29S10.net
最初にクラスを設計し始めるのは筋が悪いと思ってる。そんな3流プログラマ。
797:デフォルトの名無しさん
18/09/27 23:22:58.17 GSDkLsyd0.net
訂正;
△:シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
○:シェルスクリプトがあるだけではシェルスクリプトの解釈実行を開始することはできない
シェルスクリプトはもちろんシェルスクリプトから呼ばれるシステムコールその他の
一切合財をシェルスクリプト上だけでシミュレートする能力がある(と思う)が
全ての始まりを起こすのにC/C++で書かれたOSを要する
>>781
つまりクラスの設計はおくらすのが正しい
798:デフォルトの名無しさん
18/09/27 23:59:38.23 RQl7S0Gm0.net
来たよ、暇なので
799:デフォルトの名無しさん
18/09/28 09:32:22.81 hWUH9Sli0.net
最新のC++コンパイラが使えないので質問。
右辺値参照が仮引数になっている以下のような関数があった場合、
aaa(左辺値の変数);
とすると、ちゃんと、aaa() は呼び出される?
それともエラーになる?
void aaa(T&& a)
{
・・・
}
800:デフォルトの名無しさん
18/09/28 09:39:47.21 UtPWkOJga.net
>>1のオンラインコンパイラを使おう
801:はちみつ餃子
18/09/28 09:40:07.87 7KXXqv1B0.net
>>784
呼び出される。
lvalue は rvalue にもなる。
802:デフォルトの名無しさん
18/09/28 09:48:18.84 hWUH9Sli0.net
>>785
どこにあるの?
803:デフォルトの名無しさん
18/09/28 09:53:42.38 hWUH9Sli0.net
では、aaa()に次のようなoverloadがある場合は、「2」の方が呼び出されて、
#if の部分を 0 にすると、「1」が呼び出される?
だとすると、昔のC++では無かったような overloadの仕様かも?
T b;
aaa(b); // bは左辺値のつもり
void aaa(T&& a)
{
puts("1, 右辺値参照、T&& に来たよ。");
}
#if 1
void aaa(T& a)
{
puts("2, 左辺値参照、T& に来たよ。");
}
#endif
804:デフォルトの名無しさん
18/09/28 1
805:0:13:48.61 ID:WRA8TBfa0.net
806:デフォルトの名無しさん
18/09/28 10:23:34.25 RVKB6eOl0.net
>>784
呼び出されない
右辺値参照は左辺値を受け取らない(原則)
ただしTがテンプレート仮引数の場合と、auto&&の場合は、
右辺値参照で左辺値を受け取れる(特例)
型を推定させた場合に限り、右辺値参照は、
左辺値参照への左辺値参照に変形できる
807:デフォルトの名無しさん
18/09/28 10:32:29.28 hWUH9Sli0.net
[Compile and Execute C++11 Online (GNU GCC v7.1.1)]
URLリンク(www.tutorialspoint.com)
で下の方のコードを試したら、
$g++ -std=c++11 -o main *.cpp
main.cpp: In function ‘int main()’:
main.cpp:18:10: error: cannot bind rvalue reference of type ‘TPerson&&’ to lvalue of type ‘TPerson’
aaa(b); // bは左辺値のつもり
^
main.cpp:8:6: note: initializing argument 1 of ‘void aaa(TPerson&&)’
void aaa(TPerson && a)
^~~
というエラーになった。gcc 7.1.1 では、>>786 の言ってくれたことと合ってない???
808:デフォルトの名無しさん
18/09/28 10:33:03.33 hWUH9Sli0.net
>>791
[続き]
#include <stdio.h>
struct TPerson {
int m_age;
};
void aaa(TPerson && a)
{
puts("1, 右辺値参照、T&& に来たよ。");
}
int main()
{
printf("Hello, World!\n");
TPerson b;
aaa(b); // bは左辺値のつもり
return 0;
}
809:はちみつ餃子
18/09/28 10:35:31.98 7KXXqv1B0.net
あれ? ごめん。
確かめたら呼び出されなかった。
勘違いしてたかも
810:はちみつ餃子
18/09/28 10:39:58.90 7KXXqv1B0.net
あ、逆の場合と混同してた。
const T& に rvalue がマッチするんだった。
このあたりのルール、なんか一貫性がない感じがする。
811:デフォルトの名無しさん
18/09/28 10:40:42.82 hWUH9Sli0.net
>>793
でも、以下の std::move() の実装の説明だとあなたの言ってる方が正しい気がする。
URLリンク(stackoverflow.com)
URLリンク(www.open-std.org)
The move function really does very little work. All move does is accept
either an lvalue or rvalue argument, and return it as an rvalue
without triggering a copy construction:
template <class T>
typename remove_reference<T>::type &&move(T &&a)
{
return a;
}
It is now up to client code to overload key functions on whether
their argument is an lvalue or rvalue (e.g. copy constructor and
assignment operator). When the argument is an lvalue,
the argument must be copied from.
When it is an rvalue, it can safely be moved from.
812:デフォルトの名無しさん
18/09/28 10:44:16.75 hWUH9Sli0.net
>>790
なるほど、std::move() は、あなたの言ってくれた、template の場合に当たるから
こその動作だったんだ・・・。
813:デフォルトの名無しさん
18/09/28 10:49:49.55 hWUH9Sli0.net
>>794
template の場合と、auto の場合は、まさに、一貫性が無いということらしい。
こういう一貫性の無さのことを「直交性が低い」と言って、言語が分かりにくい
指標になるらしい。
814:はちみつ餃子
18/09/28 11:07:41.28 7KXXqv1B0.net
>>797
一貫性は無いけど、仮引数の rvalue reference に lvalue がマッチ「してほしくない」というのはわかるので、
まあしょうがない。
815:はちみつ餃子
18/09/28 11:11:50.31 7KXXqv1B0.net
>>790
ちょっと確認なんだけど、
テンプレート仮引数 T に対して T&& に lvalue がマッチするっていうのは、
実際には lvalue reference として機能するという意味でいいんよね?
(変形できるというのはそういう意味だよね?)
816:デフォルトの名無しさん
18/09/28 11:58:59.36 RVKB6eOl0.net
>>799
それ以外の何だと思うの?
817:デフォルトの名無しさん
18/09/28 12:26:11.67 hWUH9Sli0.net
>>798
あまのじゃく?
818:はちみつ餃子
18/09/28 12:29:12.61 7KXXqv1B0.net
>>800
「変形される」だったら勝手にやってくれるんだなーと思うんだけど、
「変形できる」という言い回しにちょっと引っかかりを感じたというふんわりした疑問なので、
具体的に別の可能性を思い浮かべたわけではないです。
819:デフォルトの名無しさん
18/09/28 14:07:40.60 7VsD45M6M.net
江添とお前らどっちがC++に詳しい
820:デフォルトの名無しさん
18/09/28 14:45:05.48 hWUH9Sli0.net
>>803
その人もここに来るかも知れないから。
821:デフォルトの名無しさん
18/09/28 14:53:59.72 5bmo24w9p.net
江添で言えばまさにわかりやすくその辺の事情解説してくれてるだろ
今の話で江添より詳しいとかありえねー
822:はちみつ餃子
18/09/28 17:00:34.02 7KXXqv1B0.net
>>803
江添氏は C++ を使うプログラマというよりは、
C++ の規格の専門家として C++ の知識を持ってるんだから、
かなり詳しいよ。
823:デフォルトの名無しさん
18/09/28 17:18:49.52 hWUH9Sli0.net
>>806
いずれにせよ、気持ちはうれしかったよ。
824:デフォルトの名無しさん
18/09/28 17:49:54.67 7VsD45M6M.net
>>805
そのへんの事情って?
>>806
それは本人も自負してるようだけど
825:デフォルトの名無しさん
18/09/28 18:34:51.41 2UofBC6a0.net
>>790, >>794あたりの仕様の事情な
826:デフォルトの名無しさん
18/09/28 21:21:09.15 tCflGkAm0.net
もし非テンプレート関数かつ非インライン関数なvoid bar(Foo&& a)に左辺値xを渡してビルドが通る言語規格だとしたら、
tmp = xのコピー
barのビルド結果←(tmpのアドレス)
ということになってxのコピコンが呼ばれてしまうま
つまり右辺値参照がコピコン削減になるかどうかというのは関数を右辺値参照にしただけでは決まらず、
呼び出し元の条件次第なので、bar()を作る人/使う人双方の慢心を避けるためにエラーにするんだろJK
一方テンプレート関数またはインライン展開される関数なら、上のようなへタレコードに一時的になっても
すぐさまコピコン削減ができるから実質弊害が無い
ただし、そういった関数でも再帰呼び出ししたりアドレスをとったりすると上と同じ議論になるので、
再帰呼び出し/アドレスを取る操作 両方ともありえるインライン関数は>>790の例外の適用外とされ、
テンプレート関数は再帰呼び出しが有り得ないし、アドレスを取る奇特な人間も居ないだろうということで>>790の例外が設けられた
827:デフォルトの名無しさん
18/09/28 21:24:43.89 tCflGkAm0.net
訂正;
△: すぐさまコピコン削減ができる
○: コンパイラがすぐさまコピコン呼び出し削減最適化をかけられる
コピコン呼び出し削減最適化はこの場合データフロー解析の結果を流用したらできる
C++はgotoが使われたとき、コンストラクタが呼ばれずに使われるオブジェクトが生じないか否か確かめるために
データフロー解析はもともと必須なので、コピコン呼び出し削減最適化はC++コンパイラ書きなら誰でも出来る(多分
828:デフォルトの名無しさん
18/09/28 21:34:28.86 tCflGkAm0.net
>>794
>const T& に rvalue がマッチするんだった。
それはある意味当然すぐる
const T& x = r; // rは右辺値
...
y = x // (*)
としたときに、コンパイラは(*)みたいな文が現れるまでは、
xへのアクセスを機械的にrへのアクセスに置き換えれば良いわけでゼロコスト
rが所有権を失ったらxのアクセスも不正となるが、これは書き換え可能なオブジェクトを
const参照をとってから書き換えた場合も似たようなもの(身からでたサビ
なのでコンパイラはやっぱ何もしなくて良い
829:デフォルトの名無しさん
18/09/28 21:36:22.95 tCflGkAm0.net
(30分前にこのスレを読んで初めて右辺値とか右辺値参照といったブツを知った初心者なので語ってみた
830:デフォルトの名無しさん
18/09/28 22:13:49.14 pgnHcfqPM.net
>>812
y = x
の後もxへのアクセスはrへのアクセスで良くないの?
831:デフォルトの名無しさん
18/09/28 22:40:22.15 5I7m9/jNd.net
どんな文が現れようとずっとrでいいんじゃね?
832:デフォルトの名無しさん
18/09/28 22:45:46.54 tCflGkAm0.net
>>814 >>815
ホンマや!(;゚Д゚)天才か!
833:デフォルトの名無しさん
18/09/28 22:50:40.02 pgnHcfqPM.net
>>816
ウッサイ、チネ
834:デフォルトの名無しさん
18/09/28 23:48:18.05 AAs3crMS0.net
>>810
再帰だろうがアドレスとろうがオンラインだろうが例外は適用されるだろ。
やっぱ30分で理解するのは無理じゃね?
835:デフォルトの名無しさん
18/09/28 23:50:49.06 HzE5xAmYr.net
auto a = funcA(funcB(funcC(input)));
みたいな感じの関数の入れ子ってさ、ある関数が終わる度にその都度インスタンスを作ってコピーして次の関数に渡すということを繰り返すんだよね?
つまり、関数たちの返り値が巨大なオブジェクトだったら、このように書くことで余計に時間がかかるよね?
836:デフォルトの名無しさん
18/09/29 00:09:10.14 UwfF5QN40.net
>>819
いんや。
オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし、戻り値最適化で一切何も起こらない可能性すらある。
て、はちみつが言ってた。
837:デフォルトの名無しさん
18/09/29 00:13:53.80 X+ykKtqpr.net
>>820
へぇ
> 一切何も起こらない
というのは、一切余計なオーバーヘッドがない、ということですか?
838:デフォルトの名無しさん
18/09/29 00:22:35.94 4+9Po3M4a.net
単純なコピーよりは早くなる可能性があるってだけでは?
839:デフォルトの名無しさん
18/09/29 00:30:08.48 UwfF5QN40.net
ちょっと誇張しすぎた。
正しくは「コピーもムーブも起らない可能性すらある」
コピーもムーブも起こらなければ、その分のオーバーヘッドは当然ないよ
840:デフォルトの名無しさん
18/09/29 00:36:40.21 X+ykKtqpr.net
へぇ~~~
ありがとうございます
まぁそこがボトルネックじゃない限り余計なこと考えない方が身のためなのかもしれませんが
841:はちみつ餃子
18/09/29 02:25:18.76 4F2hgYyq0.net
>>819-824
コピーもムーブも省略される可能性ってのは、左辺の場所でオブジェクトを直接に構築するっていう意味。
構築してからそのままコピーしてる (そして元のオブジェクトが一時的である) 場合は実際には直接構築したって同じよねという話。
842:デフォルトの名無しさん
18/09/29 14:26:47.44 7XGFV27+0.net
>>820
>オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし
なんかムーブコンストラクタを魔法か何かと勘違いしてないか?
ムーブコンストラクタの方が重い処理してたら当然重くなるんだぞ
843:デフォルトの名無しさん
18/09/29 14:32:22.06 OnnXxjQtM.net
>>826
ええ…
コピーより重いムーブコンストラクタの存在を前提に話す必要ある?
844:デフォルトの名無しさん
18/09/29 14:44:27.90 7XGFV27+0.net
むしろムーブで軽くなるのは大抵の場合ムーブによってヒープの確保、解放を
避けられるクラスだけ、だろ
ある意味そっちの方が限定して話をしてると思うが
基本をすっ飛ばすからはちみつその他誤解するやつが出てくる
845:デフォルトの名無しさん
18/09/29 14:49:31.13 IuTgmxg/0.net
この機能が必要になった背景・経緯
ムーブセマンティクスは、C++03でもNRVO(特定の文脈でのコンストラクタの省略)や、 C++11で非推奨となったstd::auto_ptrで実現されていた。
しかし、NRVOがいつでも機能するわけではなかった。
また、std::auto_ptrにはコピーと同じ文法でムーブしていることなど、問題が多かった。
そのため、コピーと区別でき、統一的にムーブを表す文法が言語機能として必要とされた。
つまりこんなあぶなっかしい
unique_ptr、shared
846:_ptr、weak_ptrとか使ってるヤツラも クルクルパーしかいない この程度の簡単な制御も自分で簡単に制御しきれないワケだからな
847:デフォルトの名無しさん
18/09/29 14:56:25.79 IuTgmxg/0.net
しかしアホのあたらしもの好きは半端ない
頭悪いシロモノでも新しいものができたら使わないといけない病になってるからな
シロウトに多い
848:デフォルトの名無しさん
18/09/29 14:58:40.21 7XGFV27+0.net
いや、autoはともかくshared, unique, weakは危なっかしくないと思うが・・
ムーブが使えるようになってからだし
あと個人的にはcpprefjpは規格寄り過ぎてユーザー寄りじゃないと思う
cppreference.comを使うべき
849:デフォルトの名無しさん
18/09/29 14:59:08.11 IuTgmxg/0.net
で、こんなしょうもないことより
ホントに理解しないといけない部分がすっぽりと抜けてる
850:はちみつ餃子
18/09/29 16:42:03.70 4F2hgYyq0.net
C++ の (というかプログラミング言語の) ほとんどの機能は抽象化の道具。
ムーブもまた、見かけ上は代入っぽい抽象で扱えるものであっても
実態はもうちょっと速いコードにも出来る (可能性がある)。
>>829
そういう簡単な制御すら抽象化層に押し込められない方がよっぽど駄目。
クルクルパーだと思ってるならなおさら、
簡単な制御なら (いつも間違いなく) 出来ると期待すべきでない。
そんでもって大抵の人間はクソザコで、しょうもない間違いをする。
問題は道具で解決すべき。