C++相談室 part137at TECH
C++相談室 part137 - 暇つぶし2ch714:デフォルトの名無しさん
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
そういう簡単な制御すら抽象化層に押し込められない方がよっぽど駄目。
クルクルパーだと思ってるならなおさら、
簡単な制御なら (いつも間違いなく) 出来ると期待すべきでない。
そんでもって大抵の人間はクソザコで、しょうもない間違いをする。
問題は道具で解決すべき。

851:デフォルトの名無しさん
18/09/29 17:03:15.96 7XGFV27+0.net
スマポは言語の機能じゃねーよボケ

852:デフォルトの名無しさん
18/09/29 18:38:13.57 GD2dD6IB0.net
>>833
>問題は道具で解決すべき。
ネ申は確かLL言語を創造された

853:デフォルトの名無しさん
18/09/29 18:45:43.26 Dc4laUcM0.net
ムーブはゼロの発見に次ぐ、人類史上における大発見と言われてるけどな。
ノーベル賞候補の一つにもなってるし。

854:デフォルトの名無しさん
18/09/29 18:51:41.19 GD2dD6IB0.net
std::auto_ptr<T>はもともとオブジェクトをムーブしたくて生まれたわけでは無いと思う…
確実な解放の実現が先
ムーブする仕様はあと
あとstd::auto_ptr<T>(unique_ptr<T>でも良いが)でも使わないとやってられないシチュがC++には少なくとも1つある

855:デフォルトの名無しさん
18/09/29 18:56:52.23 oWn9MzvpM.net
move元のオブジェクトに対するアクセスがコンパイルエラーになるんならわかるけど、そうじゃないんなら
大層な仕組みを入れなくても単に unique_ptr を言語組み込みで実装すれば済む話だったのでは?

856:デフォルトの名無しさん
18/09/29 19:32:03.30 YVfD+mv1M.net
お前ら江添に負けて恥ずかしくないの?

857:デフォルトの名無しさん
18/09/29 20:26:30.14 1/46iTAZM.net
全然?

858:デフォルトの名無しさん
18/09/29 21:00:53.02 vc6gAAuZd.net
>>838
それ何が嬉しいんだ?
vector とかどうすんだよ

859:デフォルトの名無しさん
18/09/29 22:03:09.07 oWn9MzvpM.net
>>841
moveするのが分かってるんなら最初からvectorごとヒープに作って unique_ptr で持てばいいでしょ
中途半端にガワだけスタックに置く意味がない

860:デフォルトの名無しさん
18/09/29 23:45:25.50 OLOWa9QF0.net
move後の元オブジェクトを破壊っていうか破棄しようって提案もあったよ。ちょっと早くなるのだとさ。

861:デフォルトの名無しさん
18/09/30 00:04:13.06 kBo12DYt0.net
>>842
ポインターならそもそも copy のコスト安いから move 要らないじゃん

862:デフォルトの名無しさん
18/09/30 00:20:38.65 aYXyCrkn0.net
それだったら最初から普通にポインタでかけよ

863:デフォルトの名無しさん
18/09/30 00:57:02.37 GfZkWSkk0.net
この3冊が、神の書!
Linux プログラミング・インタフェース、Michael Kerrisk、2012
C++11/14 コア言語、江添 亮、2015
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006

864:デフォルトの名無しさん
18/09/30 01:40:28.47 CKZYWlYLa.net
>>844
だからmoveいらないって話でしょ
C++のムーブセマンティクスがああなったのは中途半端にスタックを使うスタイルが定着してしまっていて今更ポインタ使えというのは無理があるからで、
本来は所有権の管理さえ適切に行えるようになってさえいればムーブなんか要らんよ

865:デフォルトの名無しさん
18/09/30 06:43:45.01 C9oWPEnUr.net
C++ Coding Standards って新品で買えないけど代わりになる書籍ありますか?

866:デフォルトの名無しさん
18/09/30 06:48:23.20 d4gXl3Bi0.net
>>847
ポインタ使え思想はすでにC#とかなクラスが参照型な言語で実現されているが
オブジェクトの解放にガベージコレクタが要る言語になった
これはガベージコレクタ無し・所有権の無条件移動だけだと、次のようなケースで早速話が破綻するから仕方が無い
void bar(int n) {
 std::unique_ptr<Foo> a(new Foo());
 for (int i = 0; i < n; i++) {
  func1(a, i);  // func1(a, 0);で所有権がgone 以降のfunc(a, i)はaの不正アクセス
 }
}
不正アクセスにならないように、実際にはこのようなfunc1()にはa.get()でポインタを渡す書き方をする
するとfunc1()以下の呼び出しは全部>>845になる
人類に逃げ場は無い


867:デフォルトの名無しさん
18/09/30 06:53:57.08 d4gXl3Bi0.net
それにポインタ使え思想だと次のようなケースでBaz::m_c[i]のBar:m_b[j]の:Foo::m_aのアクセスに藻前らどんだけ間接参照するんですかと、
class Foo {
 SomeClass m_a;
};
class Bar {
 Foo m_b[100];
};
class Baz {
 Bar m_c[100];
};

868:デフォルトの名無しさん
18/09/30 07:13:40.02 d4gXl3Bi0.net
ちな>>850はm_bやm_cが配列であるため、配列アクセス時の添え字が定数なシチュでもない限り、JITでも間接参照回数を3以下にはできん

869:デフォルトの名無しさん
18/09/30 09:10:22.74 3yGUdTqFM.net
>>849
よくわからんな
848の問題はそれmoveでも一緒だよね
単にデフォルトの挙動がmoveかborrowかだけの話で、unique_ptrがたまたま前者なだけ
スマポ使えば間接参照はどうしても増えるけど、実際>>850のようなケースで特定の要素だけ所有権捨てたりしないでしょ
所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、その場合に限ってスマポを使えばよい
コーナーケースのために全てを複雑にする必要はない

870:デフォルトの名無しさん
18/09/30 09:21:04.80 d4gXl3Bi0.net
>>852
>所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、
有り得ない仮定すぐる…
>>849なケースにおいて、オブジェクトaの生成時点というのは、
ライブラリー制作者がfunc1()を設計してビルドまで完了した後やがな…

871:デフォルトの名無しさん
18/09/30 09:39:54.40 3yGUdTqFM.net
>>853
自分でも分かってて揚げ足取ろうとしてるんだろうけど、コーディング時に、プログラマがオブジェクトを生成することを意図したコードを記述した時点で、な

872:デフォルトの名無しさん
18/09/30 09:46:24.24 d4gXl3Bi0.net
>>854
いやスマン言い方がまずかったそういう意味ではない
確かに
>所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、
というのは真だが、ライブラリのインターフェースに解放が必要なオブジェクトのmoveなど認めたら有り得ないコストが生じるという話
func1()の制作者が所有権を寄越すことを強制した(そういうインターフェース仕様にしてしまった)場合、
func1()を使う人はfunc1()に所有権を渡さねばならない。この結果、
 1. 呼び出し元(func1()を使う人)がaをコピーしてコピーをfunc1()に渡さねばならない
 2. func1()は呼び出しの度に、aを解放する
というのが>>849のコードでn回無駄に繰り返される
これを避ける方法はあるっていやーあるが、結局func1()以下の呼び出しは全部>>845になる(か、ガベージコレクタの出番となる
人類に逃げ場は無い

873:デフォルトの名無しさん
18/09/30 09:52:25.65 CKZYWlYLa.net
>>855
だからそれmoveでも同じことだよね?
ユニバーサル参照のことを言ってるんだとしたら、あれただの型推論だぞ

874:デフォルトの名無しさん
18/09/30 10:03:48.10 d4gXl3Bi0.net
>>856
解放が不要なオブジェクトのmoveは話がちげう
この場合、単に生ポインタ(オブジェクトのアドレス)をfunc1()に渡すのと変わらん
これはライブラリのインターフェースに現れてもコスト的には問題は無い
元レスのアンカー先>>847>>855のコストが避けられない主張

875:デフォルトの名無しさん
18/09/30 10:07:31.97 d4gXl3Bi0.net
いやすまん解放が不要なオブジェクトでも、所有権を移動した場合は>>855の1のコストは避けられないorz
ここは訂正

876:デフォルトの名無しさん
18/09/30 10:11:13.08 CKZYWlYLa.net
>>857
スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって言ってるんだけど、そんなに難しい話かなあ

877:デフォルトの名無しさん
18/09/30 10:45:39.58 d4gXl3Bi0.net
>>859
>>849>>850は、現行C++におけるスマポのmoveと本体のmoveの優劣は問題にしていない
848を現行C++のコード風に書いたから誤解を招いたのかもしれないが、比較はあくまで現行C++と846思想の比較であって、
846の次の思想を実行に移したら>>855のコストが避けられませんよという話
 1. スタックを使うスタイルはやめるべき(全部スマポであるべき)
 2. 所有権の管理さえ適切に行えるようになってさえいれば(現行C++のムーブセマンティクスみたいな)ムーブなんか要らん
1は現行C++との比較において、間接参照回数に響く
2は現行C++との比較において、現行C++では避けられるコスト(>>855またはガベージコレクション)を無駄に背負い込むことになる

878:はちみつ餃子
18/09/30 10:52:02.74 56zUhffF0.net
>>859
本体のムーブも、ムーブ出来るように書いたらカスタムなスマートポインタみたいになるから、
間接参照が入っちゃうので、なおさら同じではあると思う。
でもまあ、ムーブは抽象化の方法であって、
最終的に実行されることが同じだからなくても良いってのは暴論よね。

879:デフォルトの名無しさん
18/09/30 11:10:34.99 f0zM7Hcdr.net
アンダースコアとドットをこの順で必ず含む string があったとして、アンダースコアからドットまでの部分文字列を切り出す処理って一行で書ける?
substr と find_first_of と find_last_of を組み合わせる方法を考えたんだが、
アンダースコアの前を削る;
ドットの後を削る;
という2行に渡るやり方しか思い付かない

880:デフォルトの名無しさん
18/09/30 11:15:56.30 d4gXl3Bi0.net
ちな
>スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって
これは現行C++においても違う違いがワカル男ならワカル
func1()からfunc2()にfunc1()の自動変数aをmoveするとして、かつfunc2()はインライン展開されるとすると、
func2()におけるaのメンバへのアクセスはfunc1()呼び出し時点でのスタックポインタ相対で一発でやれる
一方、aがスマポだったりすると、aのメンバへのアクセスの前に、func1()呼び出しの都度1回はスタックポインタ相対でaのアドレスを得なければならない

881:デフォルトの名無しさん
18/09/30 11:27:40.54 fM5IaZg4M.net
オブジェクト本体のメモリのコピーにかかるコストを考慮すればどっちもどっち

882:デフォルトの名無しさん
18/09/30 11:54:22.15 u5/6mv7u0.net
>>862
substr じゃなくて、コンストラクタ使えばいいんじゃね
string t(s.begin() + s.find_first_of('_') + 1, s.begin() + s.find_last_of('.'));

883:デフォルトの名無しさん
18/09/30 12:29:37.73 f0zM7Hcdr.net
>>865
なるほど、ためになります

884:デフォルトの名無しさん
18/09/30 12:35:17.89 f0zM7Hcdr.net
>>865
ふと気になったのですが、このコンストラクタの挙動って他の名前の関数で実装されてないんでしょうか?

885:さまよえる蟻人間
18/09/30 12:48:58.63 Eso9UeUod.net
>>867
assign

886:デフォルトの名無しさん
18/09/30 13:18:31.87 f0zM7Hcdr.net
>>868
何から何までありがとうございます

887:デフォルトの名無しさん
18/09/30 14:15:51.90 QSRvujde0.net
「rustにもあるし俺らも入れなきゃ」くらいの感覚で
今までのシステムとの統合性の難しさなんかほぼ考えないで入れちゃった機能だから。
c++らしいといえばらしい感覚だけど。

888:デフォルトの名無しさん
18/09/30 14:22:42.56 d4gXl3Bi0.net
std::basic_string::find()もイテレータを返すように他のコレクションとの統合性を尊重して欲しいよな

889:デフォルトの名無しさん
18/09/30 22:56:12.57 SdlFi6Ao0.net
findを実行した対象とは別のstringの同じ位置に何かしたいとき
イテレータで返されるとちょっとだけ面倒
まあ大した問題でもないんだけど

890:デフォルトの名無しさん
18/10/01 17:20:37.02 mKeAnbBU0.net
moveセマンテックが必要になった理由を理解してないのが多くて驚くばかりだな
破壊して良い中間オブジェクトとそうじゃないのとを区別するために必要なのだよ
ポインタ使えばmove必要ないとかそういう問題じゃない

891:デフォルトの名無しさん
18/10/01 17:40:58.61 qsdLJDx40.net
元はといえば禿が左辺値参照でもconstつければ右辺値を指せるという曲がった話を始めたのが
評判悪くてC++11でやっとやっとやっとやっとメスが入ったのが本当の理由

892:はちみつ餃子
18/10/01 18:05:01.87 hbafP85H0.net
>>873
色んな話題が出てるので混乱してるが、ムーブ不要論を出してる側の *元々の* 主張は >>847 の通り
「ちゃんとした所有権の管理 (たぶん Rust みたいなやつのこと?) が有りさえすれば」
であって、でもそれは C++ ではもはや無理でしょということもわかった上だと思う。

893:デフォルトの名無しさん
18/10/01 18:05:54.55 Gge6W+rt0.net
Cにも欲しいわ
Cは参照ないから右辺値指示ポインタで

894:デフォルトの名無しさん
18/10/01 18:09:04.02 qsdLJDx40.net
それを言うなら、右辺値の概念を撤廃すべきでしょ
どんな値もポインタで指すことができ、
ポインタで指すことでregister指定を解除されるという変更

895:デフォルトの名無しさん
18/10/01 18:12:32.93 UY4lJdAP0.net
テンポラリーオブジェクトなくすと、一回必ず厳密に生成してから仕様になるので、手間増えると思う。

896:デフォルトの名無しさん
18/10/01 18:40:21.84 Gge6W+rt0.net
右辺値がないと int i = 0; すら書けなくなるんだが

897:デフォルトの名無しさん
18/10/01 18:50:50.76 qsdLJDx40.net
なんで?
int j;
j ^= j;
int i = j;
左辺値でも問題ないじゃん

898:デフォルトの名無しさん
18/10/01 18:54:00.22 xwh6ZD/vM.net
>>880
苦しいねーw

899:デフォルトの名無しさん
18/10/01 19:00:24.21 Yquio+NL0.net
0 以外はどうすんの。

900:デフォルトの名無しさん
18/10/01 19:02:25.38 Gge6W+rt0.net
> j ^= j;
はい未初期化値を使ったから未定義動作で鼻から悪魔

901:デフォルトの名無しさん
18/10/01 19:04:34.50 Yquio+NL0.net
char buf[1];
int i = (int)(buf[10] - buf[0]);
で、i = 10 に初期化される。

902:デフォルトの名無しさん
18/10/01 19:05:56.72 xwh6ZD/vM.net
NaNのときはxorは未定義か、そこまで考えなかったな

903:デフォルトの名無しさん
18/10/01 19:06:32.55 uXaVofwo0.net
>>884
間違った。正しくは:
char buf[1];
int i = (int)(&buf[10] - &buf[0]); // i = 10 と等価。

904:デフォルトの名無しさん
18/10/01 19:11:01.98 rJND5eoS0.net
そもそも=の無理やりなオーバーロードや引数に対する暗黙的なattainが問題なんだろう。
しかし元々のcのシンタックスを引き継ぎつつ、上記の問題を解決するのは不可能。

905:デフォルトの名無しさん
18/10/01 19:14:47.64 Gge6W+rt0.net
>>886
10
0
&buf[10]
&buf[0]
&buf[10] - &buf[0]
(int)(&buf[10] - &buf[0])
右辺値だらけ
やりなおし

906:デフォルトの名無しさん
18/10/01 19:19:47.07 qsdLJDx40.net
>>882
別に?
int *j;
j = &10;
int i = *j;
てだけじゃん
10が左辺値だったらって話ね
char *j;
j = "\n";
int i = *j;
て話と何か違うの?

907:デフォルトの名無しさん
18/10/01 19:23:45.27 Gge6W+rt0.net
10が左辺値ならこれ認めるの?
10 = 42;

908:デフォルトの名無しさん
18/10/01 21:57:05.81 92NEoPQV0.net
お前らがC++で作ったことあるものリスト化して

909:デフォルトの名無しさん
18/10/01 22:37:33.40 qsdLJDx40.net
>>890
全然かまわん
int a = 10;
int b = 10;
a = 42;
こう言っているに過ぎない

910:デフォルトの名無しさん
18/10/01 22:42:30.92 qsdLJDx40.net
>>879
そろそろ答えてもらおうか
なぜ右辺値がないと int i = 0; が書けないのか

911:デフォルトの名無しさん
18/10/01 23:15:35.29 2m3Ms8fl0.net
>>875
ていうか所有権などという中途半端な概念にオブジェクトの解放を担わせるのは危険か無意味かのどっちかにしかならない
最後までオブジェクトを使いたい人と、そのオブジェクトを所有する人を
コードに所有権を明示するスタイルで一致させられるケースは少ない
希ガス

912:デフォルトの名無しさん
18/10/01 23:21:45.86 2m3Ms8fl0.net
しかしながら右辺値参照を使うとコードを書く人がオブジェクトの所有権を意識せざるを得ない
これを抽象化といわれるとかなり違和感
※ 個人の感想です

913:デフォルトの名無しさん
18/10/01 23:31:19.12 rJND5eoS0.net
結局ネストしたオブジェクトってのはどう扱おうと楽な扱いなんてできんってことなんだわ。
同期と効率と安全性を全て容易にするってのは不可能なんじゃないかね。

914:デフォルトの名無しさん
18/10/01 23:41:31.83 2m3Ms8fl0.net
>>896
>結局ネストしたオブジェクトってのはどう扱おうと楽な扱いなんてできんってことなんだわ。
いや?
オブジェクトの所有権は最初のcallerががっちり掴んでオブジェクトを使うcallee以下は生ポでおk
全てが調和する

915:デフォルトの名無しさん
18/10/01 23:46:11.02 zfKNS/F/0.net
アホどもはやっと気付いたか。。。
コタエ:最初から普通にポインタで書きなさい
   unique_ptr、shared_ptr、weak_ptrなんか使ってるヤツラは
   クルクルパーしかいない


916:デフォルトの名無しさん
18/10/01 23:49:34.85 aHxMqUX30.net
>>895
右辺値参照周りを抽象化とか言ってるアホははちみつだけだろ

917:デフォルトの名無しさん
18/10/02 00:39:52.22 YrRJAaFSa.net
URLリンク(ideone.com)
上のコードで教えて欲しい。
templateでデフォルト引数で関数を指定する場合、わざわざテンプレートパラメーターFuncにdecltype(...)しなきゃいけないのは何故?

918:デフォルトの名無しさん
18/10/02 01:21:04.00 HQVsIoxF0.net
URLリンク(ideone.com)
testは関数名だから型じゃない

919:はちみつ餃子
18/10/02 02:10:18.78 wuORmtyC0.net
>>895
ムーブだのなんだの言ってても、
C++ の言語機能として直接的に有るのは rvalue 参照を区別して受け取れるってだけで、
所有権の管理をキッチリやってくれるわけではない C++ の限界なんだよね。
だけど、なるべくクラス・関数の実装の中に区別を押し込めて隠す道具のひとつにはなるって話。
でも、中途半端にやるなら隠さないで見せた方がマシという論はわかる。

920:はちみつ餃子
18/10/02 05:46:40.59 wuORmtyC0.net
受取る関数の側を上手く作っておけば
それを使う側では所有権の移動とかそんなに気にしなくない?
rvalue だったら勝手にちょっと効率的になる (こともある) ねってだけで。
使うときに気にしなくて良いように押し込められるならやっぱり抽象化の道具って言えると思うよ。

921:デフォルトの名無しさん
18/10/02 06:04:33.19 YrRJAaFSa.net
>>901
ありがとう。
template<typename Func = int (int)>

template<typename Func>
にするとエラーになるのは何故?

922:はちみつ餃子
18/10/02 06:50:19.11 wuORmtyC0.net
>>904
デフォルト引数からはテンプレート引数を推定できない制限がある。

923:デフォルトの名無しさん
18/10/02 07:00:39.49 YrRJAaFSa.net
なるほどです。

924:デフォルトの名無しさん
18/10/02 07:46:51.87 kk/2dA0Y0.net
時々、イラつかされる制限だ

925:デフォルトの名無しさん
18/10/02 08:15:45.67 Tcj3k2lbM.net
>>891
C++が得意なことを教えてください

926:デフォルトの名無しさん
18/10/02 10:26:10.74 giBEQZ0BM.net
>>903
いや呼び出す側に意識させるのが右辺値参照の目的だろ
意識しなくていいようなケースならconst参照で十分

927:デフォルトの名無しさん
18/10/02 10:31:03.15 kk/2dA0Y0.net
冗談は顔だけにしろよ
たとえばstd::threadの右辺値参照なんぞ意識してるか?

928:デフォルトの名無しさん
18/10/02 13:13:32.45 8CvSI5wK0.net
一行目に何の意味があるのかわからん

929:デフォルトの名無しさん
18/10/02 15:51:55.37 Xh7D/bbnH.net
割と昔からあるプログラムを見てるんですけど一つのメソッド内で
for(int i = 0; ……){……}
for(i = 0;……){……}
って書き方してるのをちらほら見ます
要は宣言してるんだから使い回せるだろみたいな理屈なんでしょうがビルドしようとすると当然未定義だとエラーが出ます
昔のC++だとこれがオッケーだったりしたんでしょうか?

930:デフォルトの名無しさん
18/10/02 15:56:06.09 kk/2dA0Y0.net
そうだよ

931:デフォルトの名無しさん
18/10/02 16:33:18.83 Tcj3k2lbM.net
c++で初心者が作れるものを教えてください

932:デフォルトの名無しさん
18/10/02 16:37:39.73 kk/2dA0Y0.net
rogueとか作って見てはどうよ
SetConsoleCursorPositionとGetKeyStateがあれば何とかなるだろ

933:はちみつ餃子
18/10/02 16:39:28.61 wuORmtyC0.net
>>912
むしろ古い仕様だと後者の i を宣言しようとすると、
ひとつのスコープ内で同じ名前の変数を定義しようとした扱いになってエラーになったりした。

934:デフォルトの名無しさん
18/10/02 17:18:00.03 kk/2dA0Y0.net
今のコンパイラでも当時の仕様に合わせるオプションはある

935:デフォルトの名無しさん
18/10/02 18:04:17.03 Tcj3k2lbM.net
>>915
ありがとう

936:デフォルトの名無しさん
18/10/02 19:05:29.79 Tcj3k2lbM.net
C++.でバッチ処理やbashのsedの様な機能はありますか?

937:デフォルトの名無しさん
18/10/02 19:11:57.50 kk/2dA0Y0.net
システムコマンドを実行したいのならsystem関数
正規表現ならstd::regexクラス
ファイル名に関する様々なことはstd::filesystem::pathクラス

938:デフォルトの名無しさん
18/10/02 20:37:48.16 YnEH1wx10.net
>>920
ありがとうございます
とても便利です

939:デフォルトの名無しさん
18/10/03 01:07:54.12 S2BN/gu+r.net
std::array を自作関数の引数に渡したいときって、サイズはハードコードしないとダメなの?

940:さまよえる蟻人間
18/10/03 01:11:26.75 gXNqr2Qf0.net
>>922
template <size_t t_n>
void my_func(std::array<data_t, t_n>& a)
{
...
}

941:デフォルトの名無しさん
18/10/03 01:18:33.15 S2BN/gu+r.net
>>923
なるほ
ありがとうございます

942:デフォルトの名無しさん
18/10/03 01:18:50.70 S2BN/gu+r.net
>>923
なるほ
ありがとうございます

943:デフォルトの名無しさん
18/10/03 03:04:58.67 plRFOjxw0.net
>>913 >>916
ありがとうございました。やっぱそうだったんですね
しかし検索しても全然出てこないというかどう検索したら良いものか。C++98とかの時代になるんですかねぇ

944:はちみつ餃子
18/10/03 05:02:16.81 jiQInXAP0.net
>>926
たぶんそれより更に前の話だったと思う。
「c++ for文 宣言 スコープ」でググったらこういうのとかヒットした。
URLリンク(www.ksky.ne.jp)
D&E でも言及があって、 if 文でのルールと合わせる形で修正したという話が載ってる。

945:デフォルトの名無しさん
18/10/03 05:31:10.20 F+YgKz680.net
>>917
VC++ですら廃止予定だけど
URLリンク(msdn.microsoft.com)

946:はちみつ餃子
18/10/03 05:33:04.20 jiQInXAP0.net
ARM (The Annotated C++ Reference Manual; URLリンク(amzn.asia) ) を確認してみたら、
「初期設定文が宣言ならば、宣言された変数のスコープは for 文を囲むブロックの終わりまでである」
というような記述がある。 (要するに古い仕様)
このあたりから C++98 になるまでの間に修正したってことなんじゃないかと。

947:デフォルトの名無しさん
18/10/03 07:01:52.10 IEc6BJqm0.net
>>927
キーワードと完全に同じ綴りのマクロがあると
標準ヘッダが動作保証外になる
ISO/IEC9899:2011 7.1.2 Standard headers の段落4

948:デフォルトの名無しさん
18/10/03 11:00:28.82 e50Rb7+yd.net
>>926
最初期の処理系、AT&T cfront の頃からの仕様だから 1980年台だと思う
ちなみに有名な Annotated C++ Reference Manual (ARM) は
この cfront のリファレンスマニュアルに注を付けたもの。
Mac II が出た頃の Mac のソフト開発者は Apple の MPW という開発環境の上で
AT&T のリファレンスマニュアル見ながら cfront で開発していた。

949:デフォルトの名無しさん
18/10/03 11:03:08.53 e50Rb7+yd.net
>>926
>しかし検索しても全然出てこないというかどう検索したら良いものか。
当時まだ処理系と独立して言語仕様を策定/記述したものは存在していなくて、
上記の cfront のリファレンスマニュアルと cfront の実際の動作が c++ の仕様でした。

950:デフォルトの名無しさん
18/10/03 12:23:08.82 eWsEWXO50.net
>>930
そんなもん古い環境で使うなら標準ヘッダのインクルード後に定義するに決まってるだろ
現行の標準に合わせたいけど仕方なく古い環境でも動くようにしたい場合のテクニックなんだから

951:デフォルトの名無しさん
18/10/03 13:10:09.63 IEc6BJqm0.net
>>933
俺だったらこう書くぜ
{ for(int i = 0; i < 1; i++) ; }
{ for(int i = 0; i < 1; i++) ; }
前提にしている環境を誤解させかねない変態コードには反対だ

952:デフォルトの名無しさん
18/10/03 13:21:21.77 2zzoZNSm0.net


953:



954:はちみつ餃子
18/10/03 17:25:53.30 jiQInXAP0.net
>>935
今では C でもブロックの頭という縛りは無いやで。

955:デフォルトの名無しさん
18/10/03 22:30:16.11 T5RLH7Axr.net
std::array ってコンパイル時にサイズが決まっていることを想定して作られてるんだよね?
だったら、「可変長ではないがサイズは実行時に決まる」というメモリが連続な配列がほしいなら生配列を使え、というのが C++ を作った人の気持ちなの?

956:デフォルトの名無しさん
18/10/03 23:04:38.92 p3pJJViFa.net
それこそvectorじゃないの

957:デフォルトの名無しさん
18/10/03 23:19:51.08 frDsf1q90.net
>>937
いや、昔はイニシャライザーリストがなかったので、初期化式が使えるオブジェクトの立ち位置だった。
イニシャライザーリストが入ったのでほぼ産廃。constexprの対応もなく死んでいる。
基本的に配列っぽいものがほしかったらベクター使ってっていう趣旨だったと思う。

958:デフォルトの名無しさん
18/10/03 23:26:50.16 T5RLH7Axr.net
>>938-939
vector ってメモリ空間連続ですか?
だったら迷わずこれ使うんですが

959:デフォルトの名無しさん
18/10/03 23:29:56.10 frDsf1q90.net
>>940
&V[0]すると一本のメモリの先頭が取れると規格書に書いてあると聞いた。
これは、サイズを拡張するなどのメモリ変更があるまで同じものを指してると思う。

960:デフォルトの名無しさん
18/10/04 00:07:58.65 zm1AtLvQ0.net
>>940
迷わず使っていいですよ

961:デフォルトの名無しさん
18/10/04 00:35:06.85 b1qTAw9u0.net
C++11からvectorのメモリ空間は連続でなければならないと規格で決められた
安心していいよ

962:デフォルトの名無しさん
18/10/04 00:40:31.88 bav+IDITr.net
>>941-943
ありがとうございます
しかしメモリが連続じゃないといけない外部ライブラリに vector 渡すの結構緊張しますね

少し飛躍するのですが、vector の入れ子は流石に連続とは限りませんよね?

963:デフォルトの名無しさん
18/10/04 00:58:43.11 s35zoLCpa.net
メモリ連続させたいならvectorの入れ子はよして。
最初arrayで考えてたなら画像とか行列とかそんな感じかな?

964:デフォルトの名無しさん
18/10/04 01:32:01.20 ezH2Wklod.net
>>943
太古から実際には連続だし規格として明記されたのは C++03 から。
C++11 で連続と規格化されたのは string (basic_string) の方。

965:デフォルトの名無しさん
18/10/04 01:57:52.21 CYtCz8O/r.net
>>945
いえ、もともとは生の一次元配列を使ってて、array の方が取り回しが良いのかなと考えただけです
実際は vector が最強ということですね
入れ子云々は本当に気になっただけです
多次元配列は、色々諦めて Boost を使っています

966:デフォルトの名無しさん
18/10/04 03:00:41.82 SxiNReMs0.net
変数名とかクラス名にめちゃくちゃ毎回悩む
従業員の名前、社員番号、階級みたいなクラスを作るときのクラス名とかって普段どうしてる?
Employeeだけで良いのだろうか
DataとかInfoとか意味のあるようでないような命名が頭をよぎってしまう
仮に従業員をEmployeeとしたときに会社名と従業員リストのDictionary<string, List<Employee>>の変数名とかどうすりゃええねんってなる
CompanyではないしCompanyDataだとそれっぽいが的確でもなさそうだし...

967:デフォルトの名無しさん
18/10/04 03:38:58.82 ezH2Wklod.net
emproyees でいいだろ
for (consy auto& emproyee : emproyees["Microsoft"]) ...

968:デフォルトの名無しさん
18/10/04 03:39:14.21 ezH2Wklod.net
rじゃなくてlか

969:さまよえる蟻人間
18/10/04 04:00:10.87 MLculXgyd.net
MapCompanyNameToEmployees

970:はちみつ餃子
18/10/04 04:12:55.17 1wg41Y300.net
>>940
vector が連続と明記されたのは C++03 だが、
C++ 標準の体制としては仕様の「欠陥」と認められた項目については過去の版にさかのぼって適用されることがあり、
vector が連続であるというのもそのひとつのはず。
つまり、 C++98 を名乗る処理系でも vector は連続であるべきで、実際にほとんどそうなっていると思う。

971:デフォルトの名無しさん
18/10/04 04:54:31.87 MQvrn7bB0.net
>>948
クラス名・変数名に迷ったら書き込むスレ。Part28 [無断転載禁止]©2ch.net
URLリンク(mevius.2ch.net)

972:デフォルトの名無しさん
18/10/04 19:12:35.69 Ohr0xwue0.net
>>948
素直に日本語使えばええやんけ。

973:デフォルトの名無しさん
18/10/05 00:43:30.52 SgefIaql0.net
英語の複数形は便利すぐる
emproyee_list[]の代わりにemproyees[]で済む
大文字小文字でキャメルケースも使えるしほんと出来過ぎ

974:デフォルトの名無しさん
18/10/05 01:05:30.84 lAZe+Hwv0.net
単独かコンテナで意味が大きくかわるのに
字面の違いがsのありなしは微妙すぎていまいちだと思ってる

975:デフォルトの名無しさん
18/10/05 06:55:01.43 226EunUa0.net
しかしそこまでメモリに直触りするならvectorでない方がいい気がするんだが。

976:デフォルトの名無しさん
18/10/05 07:56:42.65 Zg//fZBj0.net
だよな
生メモリがいるなら生メモリ使えってこと

977:デフォルトの名無しさん
18/10/05 08:13:10.92 8YBbWag1r.net
>>957-958
サイズの取得とかオシャレにできないじゃん

978:デフォルトの名無しさん
18/10/05 12:49:05.99 cQzHZ22n0.net
生メモリのサイズの管理の仕方さえ忘れたか

979:デフォルトの名無しさん
18/10/05 18:47:04.93 4ThlZrTR0.net
>>948
g_dictCompanyInfo

980:デフォルトの名無しさん
18/10/05 18:49:08.38 4ThlZrTR0.net
>>961
もし、今後絶対、employee の情報しか入れないと言い切れるのなら、
g_dictCompanyEmploees
でもいい。何か追加する予定なら、>>961 のように「g_dictCompanyInfo」

981:デフォルトの名無しさん
18/10/05 18:51:17.31 4ThlZrTR0.net
>>948
最初の従業員のデータについては、
EmployeeInfo
二番目の dictionary の方は、
g_dictCompanyEmploeeInfo_s

982:デフォルトの名無しさん
18/10/05 20:18:06.35 2Vgho4wC0.net
g_とか_sとかなんなんだそれ

983:デフォルトの名無しさん
18/10/05 21:02:11.53 eXLBKWdN0.net
秘密の呪文

984:デフォルトの名無しさん
18/10/05 21:42:38.07 s/+stmcD0.net
ハンガリアン記法とかいうMSが編み出した負の遺産

985:デフォルトの名無しさん
18/10/05 21:54:51.59 wRA0FWgN0.net
型付けるハンガリアンは糞だけど、グローバル変数にg_付けるのは普通でしょ
付けないの?

986:デフォルトの名無しさん
18/10/05 21:56:47.70 zW6/2yxd0.net
グローバル変数使わないしg_つけてもなんの役にも立たないし

987:デフォルトの名無しさん
18/10/05 22:29:36.85 dsZIcecxM.net
スコープを示すハンガリアンは変数のスコープを不必要に広げることに対する心理的抵抗を低減するという点で害悪

988:デフォルトの名無しさん
18/10/05 22:48:31.92 qdFd1sVz0.net
あの複雑怪奇な名前解決ルールを受け入れているC++使いからしてみれば、変数が
ローカルかグローバルかなんてわざわざ目印付けるほどのことじゃないのかも

989:デフォルトの名無しさん
18/10/05 22:49:02.31 SgefIaql0.net
パブロフの犬カヨ
グローバル変数の先頭に「g_」を付け続けると
そのうち先頭に「g_」とつけただけで

990:デフォルトの名無しさん
18/10/05 23:02:57.02 SgefIaql0.net
しかしいかにクラスFooに関連するオブジェクトは全部Fooのコンストラクタかsetterで渡すか一時オブジェク
トとしてメソッドの引数として都度渡すのがオブジェクト指向設計としての理想とはいえ実際には対数表のカ
スタマイズ版みたいにかなり普遍的な意味を持つテーブルTが存在する前提でいっぱいクラスを定義したい
ときもあるわけでそういうときはテーブルTをグローバル変数とした方がスマートに書けるTがこの世に1つし
かないのにいちいちインスタンス毎にTへのポインタを持たせるのですかみたいな、
で、そうするとグローバルであることの目立つ標識が欲しいところだがオリジナルの規則を考えるのもアホら
しいので使用人口が多そうな「g_」を使う

991:デフォルトの名無しさん
18/10/05 23:05:20.25 cQzHZ22n0.net
60億人がシステムハンガリアンの良さを発見できなかった
そういうことだ

992:デフォルトの名無しさん
18/10/05 23:06:16.17 cQzHZ22n0.net
せっかく自動化したものを蒸し返す愚行
機械に使われる人間に自ら志願するようなことでしかない

993:デフォルトの名無しさん
18/10/05 23:14:36.32 MM5jcfpFM.net
ハンガリアン記法が滅亡した時にgとかsとかのスコーププレフィックスも一緒に絶滅したと思うの。

994:デフォルトの名無しさん
18/10/05 23:19:28.57 SgefIaql0.net
もうそういうのは見飽きたからハンガリアン無差別否定派とアプリケーションハンガリアン推進派が頃しあって消滅してくれたらいいのに…

995:デフォルトの名無しさん
18/10/05 23:22:01.95 4ThlZrTR0.net
「ハンガリアン記法を使うと、コードの断片からでも何かを発見できる。」

996:デフォルトの名無しさん
18/10/05 23:25:38.27 4ThlZrTR0.net
C#では、メンバ変数 aaa をアクセスする時には、必ず、
「this.aaa」
とするらしい。これは、C++で、ハンガリアン記法を使った場合の、
「m_aaa」
に該当する。this. と m_ では、後者のほうが短く便利。
m_ も、this. も付けない場合、たとえば、コンストラクタで
同じ意味の仮引数を使いたい場合に、何らかの別の名前を
考えなければならなくなる。

997:デフォルトの名無しさん
18/10/05 23:26:32.77 eEmdo3hB0.net
サイズ変更してキャパシティ変更になったらデリートかかる可能性が高いのでそういうことを一応管理しないといけない。

998:デフォルトの名無しさん
18/10/05 23:28:00.34 SgefIaql0.net
>C#では、メンバ変数 aaa をアクセスする時には、必ず、



999:>「this.aaa」 >とするらしい。 mjd? いつから?次の元号から??



1000:デフォルトの名無しさん
18/10/05 23:29:24.93 3VgmxBOW0.net
一般的に言われているシステムハンガリアンのデメリットはg、s、mには当てはまらない。
iとかdwとかlpszみたいな糞接頭辞とは分けて考えたほうがいいと思うよ。

1001:デフォルトの名無しさん
18/10/05 23:31:13.38 4ThlZrTR0.net
個人的には、以下のような命名規則は大いに役立っており、
コード全体を見ずにコードの断片を見るだけで、何も考えずに
コーディングが出来ることが多くなる。おかげでずいぶん楽になった。
char *pszText;
char szText[256];
CString strText;
char **ppszText;
「sz」は、0終端文字列。s = string、z = zero。
p は、ポインタ、str は、CString。
pp は、ポインタへのポインタ。

1002:デフォルトの名無しさん
18/10/05 23:36:17.35 zW6/2yxd0.net
m_がついててもそれがメンバである保証が何もないからなあ。無駄なだけ

1003:デフォルトの名無しさん
18/10/05 23:39:57.45 4ThlZrTR0.net
>>981
個人的には、i や dw は滅多に使わない。
lpszは、自分では使わない。pszは使う。
なぜなら、lpsz の「l」 は、16BIT時代から32BIT 時代へ移行したときの産物だから、
今は時代遅れなので。
ところで、dwRead と書くと、宣言を見返さなくても、読み込みバイト数を表す DWORD 値だと
分かって便利。dwWrite だと、その書き込み版となる。変数名が規則変化するのでとっても便利。
たとえば、「text」という変数名だと、CString 型なのか、0終端文字列なのか、
0終端が付いてないような特殊な文字列なのかが分からない。
ところが、ハンガリアン記法を使うとそれらが明確に区別できる。

0終端文字列を配列で持っているのか、それとも、そのアドレスをポインタで
持っているのかも、sz か、psz かで区別できる。
このことはバグの少ないコーディングにとても役立つ、。
頭を使わなくても機械的にコーディングできてしまうことが多くなるから。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch