C++相談室 part137

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 12c3-4saf)
垢版 |
2018/08/27(月) 16:02:00.94ID:vY3QDx2y0
次スレを立てる時は本文の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/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/09/24(月) 03:48:58.75ID:tUW1+gfS0
誤爆した。 ごめん。
2018/09/24(月) 09:51:46.55ID:dKKNaNpJ0
本当にテンプレートが必要なものってだいたいSTLに揃ってる印象。
あとはTBBみたいにある程度低いレイヤーの抽象化ではどうしても必要にはなる。
しかしこの種類のライブラリってのは本当に信用できる奴が作ったもの以外は
使いたくねーんだわ。
めちゃくちゃデバッグコスト高いからね。
そういう意味で一般プログラマーが実装するってのは実践的ではない。
2018/09/24(月) 10:18:16.36ID:cpSL59m30
テンプレートは型の定義をすり替えるために使うもの
#ifdefで型切り替える方がもっと糞だからそこはテンプレートにするべき
それ以上の凝った事はしないほうがいいね
2018/09/24(月) 11:22:17.38ID:GIs1tf8Y0
頼りすぎつーか逆だと思うぜ
コンテナの要件なんかインターフェイスにすればすっきりするのに
紙マニュアル(pdf含む)でガタガタ書かれた口約束とかすげーイヤ
歴史的に見てもそれをやるのに充分な言語機能がもうあったのに
2018/09/24(月) 11:36:08.69ID:tUW1+gfS0
>>675
現状の C++ では型の制約を表すには意味不明な SFINAE で回りくどくやってて
初心者には使いこなせない (中級者でも不安があったり面倒だったりする)
という話の文脈だから、言語機能が充分だというのはちょっと変な立場だ。
2018/09/24(月) 11:43:09.69ID:IXp/Ejzw0
どうーがんばっても停止性問題は機械的に解けないケースを無くせないのだから
プログラミング自体をアルゴリズム化する企てはどこかで行き詰る
藻前らは行き詰まりかたの良し悪しを議論しているにすぎないのだガハハハハハハ
2018/09/24(月) 11:47:19.43ID:tUW1+gfS0
>>675-676
ひょっとして抽象クラスでやったらいいという話だろうか。
Java とかから来た人はそういうことをやりがちだけど、 C++ の設計理念からすると、
少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う。
2018/09/24(月) 12:24:10.58ID:GIs1tf8Y0
>>678
動的結合のコストは関数ポインタなみにはっきりしてるだろ
2018/09/24(月) 12:28:24.97ID:cpSL59m30
インターフェース(=データメンバーなし抽象クラス)は静的な型の制約を表現できないからダメ
2018/09/24(月) 12:58:55.73ID:XuY/8j5Q0
>>678
>C++ の設計理念からすると、
>少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う
滅茶苦茶言うな
https://cpplover.blogspot.com/2015/09/memoryresource.html

>>673
ついでに開発コストも高い
STLが優れてるのは、作者が長年コンテナについて熟考に熟考を重ねたライブラリだからであって
それを実現するためにテンプレートが使われたに過ぎない
テンプレート使ってりゃなんでも有用なライブラリになると勘違いしてるアホが増えた
2018/09/24(月) 13:04:35.46ID:B4Me2M7J0
テンプレートは即席麺的な発想でライブラリのような寝かして熟成させるワイン的な使い方には向いていない
2018/09/24(月) 13:10:53.22ID:IXp/Ejzw0
インターフェースはあらゆるメソッドを最初から詰め込まねばならないからイヤソ(特に単一継承の場合
お禿様も自著でそういう傾向(あらゆるメソッドが基底クラスに集中する傾向があることをこっそりカミングアウトしていたはず
テンプレートにはそういう制約がない
型引数Tにadd()メソッドがあるものとしてテンプレートを書いたら、add()メソッドがある既存クラス全部にそのテンプレートが使える
というわけで、インターフェースはそれ自体静的な型の制約のつもりなのかもしれんが、
真にかけたい制約(上の例でいうとadd()メソッドの存在だけを問題にしたいケース)に対して不必要に過剰になることが多いキモス

あとインターフェースだとコンテナの実現は具体的にはどうするんじゃ…
仮想関数テーブル参照の実行時コストだけでも許容し難いのに、間接参照がさらに必要になるんじゃ…
2018/09/24(月) 13:22:48.05ID:GIs1tf8Y0
インターフェイスを単一継承前提で考えるって、どんな教育を受けるとそうなるのかな
numeric_limits<uintmax_t>::max()歩譲って単一継承ってことにしても
最初から全部詰め込みなんてハメにはあまりならないし

あらゆるメソッドが基底クラスに集中するなんて事例あるか?
俺は空想論だと断言するぞ
Smalltalkのobjectみたいなクラスに何が置けるんだよ

あと、なんか仮想テーブルのコストが云々いってるやつが複数いるようだが
具体的にどのくらいか、せめてオーダーくらいわかっているのか
2018/09/24(月) 13:35:23.36ID:cpSL59m30
オーダーの問題じゃなくて、C++にはゼロオーバーヘッドの原則があるんだから
ゼロオーバーヘッドに出来るものはゼロオーバーヘッドにするんだよ、標準はその手本なんだから

それにオーダーなんか処理内容でなんぼでも変わるだろ
せいぜい数十万要素のコンテナしか使わないプログラムだから仮想テーブルなんかどうでもいいと主張する奴の言うことは正しいかもしれないが
数兆個の要素を扱う人にはそんなもの慰めにならん
2018/09/24(月) 13:56:47.91ID:IXp/Ejzw0
>>684
>インターフェイスを単一継承前提で考えるって、どんな教育を受けるとそうなるのかな
型に対する静的制約を実現するにあたり、多重継承は助けにならないからですだが…

>あらゆるメソッドが基底クラスに集中するなんて事例あるか?
上とまとめて理由を述べる
今、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にメソッドを集中させる必要が一切ナッシング
2018/09/24(月) 14:02:13.87ID:IXp/Ejzw0
ていうか最後の2行で筆が滑ったorz
テンプレートで「加減算ができるクラス」という制約をかけるにはインターフェースA、Bもそもそも要らん
スゲー便利
2018/09/24(月) 14:25:40.72ID:yuMzZsdXa
templateはダックタイピングだとおもう
2018/09/24(月) 15:09:08.71ID:tUW1+gfS0
どう説明したもんかと思ったけど、 >>683 の説明が分かりやすいな。
(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
全体のデザインが定まらない。

関数が要求する性質 (インターフェイス) が増えた時に元の定義をいじるか、
mixin のような形で継承関係を作ることになる。
ちょっと機能を増やすだけでいらん継承関係を作るのは良くないという話の延長線上で
考えればインターフェイスを使ったところであまり解決にならない。

型制約 (コンセプト) は関数の側に付加するものなので、後付けが簡単だ。
結果的に型の側はその性質を持たなきゃならないことにはかわりないが、
性質を追加するのに元のクラス定義を弄らなくて済む。

-----------

最初の設計がキッチリしてたら、
クラス指向的なスタイルの方が混乱が少なくて良いかもしれないなと思い始めてきた。

でも、現実にはそうではない後付けだらけじゃん? とも思ってるわけ。
2018/09/24(月) 15:15:20.89ID:GIs1tf8Y0
>>686
型に対する性的制約って何?
それと事例あるか?と聞いている質問に何で長文がいるんだよ
具体的なライブラリとクラス名を挙げるだけだろうが
なるべく知名度の高い事例ほど説得力があるぞ
2018/09/24(月) 15:32:49.32ID:XuY/8j5Q0
>>689
コンセプトを盲信しすぎだろ
あくまで要件をコードで示せるだけだっての

それこそSTLには必ず導入されるべきものだけど、そのSTLでの不満、
つまりInputIteratorだのなんだのの要件をいちいちリファレンス参照しないとわからなかった(>>675)から
必要とされたわけで

はちみつとかは多分STLべったりで、それ以外のライブラリを読んだり
まともにソフト書いたことないから、STLがほとんど出てこない状況ってのを経験してないんだろ

>ちょっと機能を増やすだけでいらん継承関係を作るのは良くないという話の延長線上で考えれば
話を広げすぎ。
型の制約という意味でいえば、現状コンセプトを待つしかないが
多分>>684が言ってるのは、Modern C++ Designで言うところのポリシークラスみたいな話じゃね?(違うかもしれんけど
この場合はあくまで要件定義なので当てはまらないと思うけど、
>いらん継承関係を作るのは良くない
これは暴言。Andrei Alexandrescuに言ってくれば?
ポリシークラスのような、継承によって機能を取り込む設計も非常に便利だし、それこそSTLでもあちこちで使われてるんだがww

あと後半チラ裏にも程がある。何様だよ
2018/09/24(月) 15:33:05.07ID:cpSL59m30
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はコンパチブルじゃなきゃいけないとか
そういうのが型の静的制約
2018/09/24(月) 15:39:44.60ID:GIs1tf8Y0
へーえ、vector<int>とvector<string>が掛け算できないという制約が
pure virtualを使った途端に無法状態になってしまうのか
2018/09/24(月) 16:03:46.76ID:cpSL59m30
じゃあ練習問題だ
IntVector::begin()の戻り値はIntIteratorで、IntIterator::value()はintを返す
StringVector::begin()はStringIteratorで、StringIterator::value()はstringを返す
そういう制約を表現するインターフェースIVectorを具体的に書いてみよう!

出来やしないのは手を動かせばすぐわかる
2018/09/24(月) 16:06:21.46ID:cpSL59m30
ああこれだけだと出来ちゃうか
end()もあってbegin()と同じ型のイテレーターを返すっていう制約も付けてちょうだい
2018/09/24(月) 16:08:34.73ID:GIs1tf8Y0
#define interface struct
template <typename T>
interface IVector
{
class iterator;
virtual iterator begin() const = 0;
};
2018/09/24(月) 16:14:35.10ID:tUW1+gfS0
>>691
ポリシークラスは注入 (?) すべきポリシーをパラメタ化してるだけで、
何をパラメタにするかというデザインがきちんとしてれば有用だし、
いらん継承だとは思わないよ。

でも、現実には後になってそれがわかることもあるよねっていう話。
2018/09/24(月) 16:24:48.03ID:cpSL59m30
>>696
テンプレート使ってんじゃねえよ雑魚
2018/09/24(月) 16:34:08.72ID:GIs1tf8Y0
>>698
は? 後出しで言い訳してんじゃねえよ蛸助
インターフェイスがテンプレートになってる実例をまさか知らんのか?w
2018/09/24(月) 16:37:21.35ID:cpSL59m30
お前の主張通り継承で全部やれよ
そういう所が雑魚なんだよw
2018/09/24(月) 16:38:54.75ID:GIs1tf8Y0
捨て台詞吐いて逃亡かw
追わねえよくっだらねえ
2018/09/24(月) 16:41:06.83ID:cpSL59m30
そっくりそのままお返ししますわw
テンプレートと継承の出来ることと出来ないことの区別がつくまで二度と下らない妄言吐くなよ
2018/09/24(月) 17:18:02.91ID:XuY/8j5Q0
>>697
>現実には後になってそれがわかることも
それは
>何をパラメタにするかというデザインがきちんとしてれば
が後で変更になることもある、ってことだろうけど
そこまでの変更があったら、結局元の定義に手を出さなきゃいけないのは
どんな設計でも同じことだと思うけどなぁ

>性質を追加するのに元のクラス定義を弄らなくて済む
と言ってたが、それは結局関数とかでクラスの要件を必要以上に大きくしないように
例えばallocator_traitsみたいに、色々手間をかけて、利用するクラスへの依存を減らすのと同じじゃね?
俺にはそういうイメージしか沸かないんだが
コンセプトマップってそういうことだろ
結局テンプレートであれこれ書くことになるか、コンセプトマップであれこれ書くことになるか、ってだけ
(=開発コストは高い)

std::vectorだって、例えばアロケータは初期化時に渡さないといけないし
コピーとかしたときにアロケータはコピーしてくれなかったと思うが
それが不便だという声もある(ここでたまに取り上げられるEASTLの開発動機で触れられてる
あと、アロケータは型に依存するけど、メモリ確保なんてのはそもそも型は関係ないので
アロケータのあの設計は失敗かもね、というのもある(同じくEASTLでも触れられてる
それに対する代替案として、上で挙げたstd::pmr::memory_resourceが出てきたわけだけど、
今更STLの基本設計は変えられないのでpolymorphic_allocatorでラップするということになった

もしvectorがポリシークラスを受け取って、アロケータやメモリ管理についてもっと汎用化してたら
こういう問題は起きなかった(クッソ複雑になってるだろうけど)
これコンセプトでどうにかなるか?後になってわかってもどうにもならんよ
2018/09/24(月) 17:46:45.01ID:yIbiTIWcr
ヒープ領域にインスタンスを作りたいときってどうしてもポインタを意識しないとダメなの?

MyClass abc;
みたいに宣言したいんだが。

MyClass* abc;
abc = new MyClass;
みたいにするしか方法ないの?


ヒープに作りたい理由は、巨大なオブジェクトだから。
ちなみにスマートポインタは使えない (icpc 12.0.4)。
2018/09/24(月) 17:53:54.47ID:CvpxIDb80
コンパイラに指示できるか、という意味ではないよ
そんなのあったも紛らわしいだけだと思うけど
2018/09/24(月) 18:26:32.41ID:sIOpRstjM
>>704
MyClass& abc = *new MyClass;
でいけるかも知らんけど十中八九delete忘れるし後から見て分かりにくいだけだから俺ならやらない
2018/09/24(月) 18:31:59.03ID:cpSL59m30
struct MyClassHolder
{
 MyClass* p;
 MyClassHolder(): p(new MyClass()){}
 ~ MyClassHolder(){delete p;}
};

とか作っとけばいいんじゃない
自分でスマポ書いてるのと同じだけど
2018/09/24(月) 18:47:38.62ID:yIbiTIWcr
>>707
ありがとうございます。
参考にします。


ちなみにポインタをどうこうしたくない理由は、これまで MyClass のインスタンスを参照渡しするように作っていた関数を、できるだけ変更したくないからです。

参照渡しをポインタ渡しに変えて、関数内に適宜アスタリスクを挿入するだけですか? 考えるのもしんどいです。
2018/09/24(月) 18:55:55.79ID:tUW1+gfS0
>>703
> 色々手間をかけて、利用するクラスへの依存を減らすのと同じじゃね?

その通りだよ。
プロトコル指向でいうプロトコルは C++ で言うならまさにトレイツに相当すると思う。
(C++ では実装を直接的に強制する方法ではないけど。)

継承構造ではなく性質でジェネリック関数を使うってだけ。
継承で表すよりも性質で表現する方がたぶん記述は細分化されることになるので、
それが手間かもしれないし、
関連するものがとっちらかる感じはあると思う。

だけど「こういう型」というよりは「こういう性質」という方がプログラムが分かりやすくない?
既に述べたように拡張が楽というのもある。


ただ、プロトコル指向的デザインでは機能を追加することは出来ても
既に問題が生じているものをスパッと綺麗に解決できるわけではないので、
いつでも元の定義を弄らずに済むほど万能とはさすがに言わないよ。
vector なんてそれこそ達人たちが検証してるだろうから、
私が思いつくようなことが入り込む余地は無いだろうし。

そこらへんは程度問題なので、積極的に (あるいは消極的に)
(テンプレートを用いた) プロトコル指向的デザインを
使うのが割に合わないという場面もそれなりに多くあると思う。
繰返すけど、そこまで万能と思ってるわけじゃない。
2018/09/24(月) 19:02:18.61ID:63DR0NZS0
>>704
static 宣言する、というのはありな状況ですか?
static MyClass abc;
2018/09/24(月) 19:02:38.38ID:XuY/8j5Q0
こいつ金慶珠みたいなやっちゃな・・・・マジめんどくさい
2018/09/24(月) 19:04:43.22ID:XuY/8j5Q0
>>711>>709

>>708
関数の方を変えなくても、渡すとこで
auto a = hoge(*pMyClass);
でいんじゃね?
それも大変なら>>707みたいにラップするしかないけど
2018/09/24(月) 19:14:36.90ID:yIbiTIWcr
>>710
オブジェクトのサイズが動的に変わるので、難しいです(合ってるかな?)


>>712
> 関数の方を変えなくても、渡すとこで
> auto a = hoge(*pMyClass);
> でいんじゃね?
> それも大変なら>>707みたいにラップするしかないけど

void hoge(MyClass abc);
なる関数 hoge() に、
MyClass* pabc;
pabc = new MyClass;
hoge(*pabc);
とする、ということですよね?
この方法では、関数呼び出し時にコピーコンストラクタが呼ばれますか?
それとも参照渡しのように、実体(?)が渡されるのでしょうか。
2018/09/24(月) 19:30:44.68ID:XuY/8j5Q0
>>713
呼ばれないよ
参照渡しと同じことになる
2018/09/24(月) 19:31:36.39ID:XuY/8j5Q0
あ、もちろん関数側の受け取りを参照のままにしてれば、だけどね
2018/09/24(月) 19:42:51.66ID:E4VB1fuR0
>>708
MyClass abc1;
foo(abc1);

MyClass* abc2 = new MyClass;
foo(*abc2);
delete abc2;
2018/09/24(月) 19:44:00.35ID:E4VB1fuR0
あっ、既に出てたわ
2018/09/24(月) 19:51:26.90ID:yIbiTIWcr
>>714-717
すみません。
>>713は間違っていますね。
hoge() の定義は
void hoge(MyClass& abc);
でした。

ありがとうございます。
提案していただいた方法なら、関数側はほぼ何も変えないでできそうです。
初歩的な質問に付き合っていただき感謝します。
2018/09/24(月) 20:06:20.22ID:I/nCcJf20
https://ideone.com/l7t0qz
上から取れないマウントを取りに行くスタイル。
2018/09/24(月) 20:23:29.03ID:SA5x5JnZ0
ボレロ村上さんや江添さんみたいなプログラマーになりたいんですが、彼等はどうやってC++についてあんなに詳しいのでしょうか?
2018/09/24(月) 20:29:49.13ID:I/nCcJf20
どっちも早いころからパソコンを触っており、
早期にはこんなに言語がなく血反吐吐いて低級言語を覚える必要が少しあり、今はその応用で食ってける。
C/C++も今ほどライブラリがなく、自作するか引っ張ってくるしかなかったうえにそもそもコード系のシャルネットワークがなかった。
2018/09/24(月) 20:40:24.56ID:dKKNaNpJ0
前提として奴らは別にプログラマーとして有名なわけではない。
コードを書く能力と有名なことが反比例しているわけだがそれでもいいなら
彼らの真似事してれば同じようになれるんじゃね?
2018/09/24(月) 20:50:32.86ID:I/nCcJf20
まぁ、名前を聞くようになったのはツイッターあたりからやね。
江添氏はコードのお作法がおかしいと食いついたりしてたし、委員会に近いところにいたのでそういう情報を発していた。
けど、個人ではあまりコードは書いてないみたいだな。
ボレロ氏は高専言いっててそこらへんで色々学んでconstexprライブラリで名前を売ったってところはある。
その後縮小して最近コードを書いているという話は聞いてないような。

どっちも有名になったのはこの世の不満とオタクの人権みたいなのを発していたら有名になったってところはある。と思ってる。
2018/09/24(月) 21:16:51.40ID:GIs1tf8Y0
誰にでもウイークポイントはある
そこを苛める遊びに固執する阿呆は誰からも何も学べないまま
自らがウイークポイントのみからなるコンパクト星として成長するのみ
世の中の誰からも軽蔑しか受けない天涯孤独な存在だ
2018/09/24(月) 21:32:17.37ID:XuY/8j5Q0
まぁ江添氏は委員会の人間だしコードあんま書いてなくても日本のC++ユーザーのために
仕様の解説してくれてるしね
ボレロ氏は・・・まぁその・・・・・生産性あるんだか無いんだかよくわからんライブラリ作ってるというか
あれはあれで勉強になるけど・・・・w

ただ初心者が「ああなりたい」ってよく言ってるのは理解に苦しむな
中途半端な知識でドヤ顔するのでなく、真摯に解説するサイトでも作ってくれりゃ価値があるけど
個人的には彼らを崇拝する人を見るたびに、もやもやした気分になる
言語は道具なんだから使ってなんぼやろ・・・
2018/09/24(月) 21:37:21.19ID:SA5x5JnZ0
>>725
まあ結局言語は道具といっても、作ったものが革新性があったり、真似できないようなら人気を集めるような気がするんだよね
東方のZUNとか別にそこまで凄いゲームでもないけど、プログラマーとしてそこそこ尊敬されてる
2018/09/24(月) 21:59:39.82ID:dKKNaNpJ0
仕事でコード書いてたらc++の最新の仕様を追えないからやらない
とか本気で言ってしまう奴は根本が腐ってると思うよ。
言ってて矛盾を感じないのかと。
2018/09/24(月) 22:02:16.29ID:orHhPIQU0
目標が名声なのか、C++理解度なのか・・・
粛々とコード書き続けるのが一番
2018/09/24(月) 22:40:40.71ID:SA5x5JnZ0
>>728
もちろん理解度なんだけど、何となく日本以外だと彼らしか目標とする人物が見つからなくて
2018/09/24(月) 22:55:21.63ID:CvpxIDb80
ISO/IEC読んでworking draft読んでおまけにg++/clangの実装で読んで
それでみんが知らなそうな重箱をつつくような仕様拾ってきてブログのネタに
すればいいんでないの?知らんけど
2018/09/24(月) 22:59:57.25ID:XuY/8j5Q0
まぁ日本だと、解説サイトで目につく人ってそんなもんか
ZUN氏挙げるのははちょっと不思議だけど・・・
以前東方に使われてる技術の解説がどこかにあったけど、
タスクシステムみたいな古くからある2Dシューティングの常套手段とかしか記憶にない
(なんか驚くようなのもあったかもしれんけど

仕事で書いてると驚くようなコードとか設計をあちこちで見かけるけど、
そういうの書くのはやっぱ誰も知らない無名の職業プログラマだったりするよ
2018/09/24(月) 23:31:07.79ID:nTOSaHPIH
>>731
今もそういう夢いっぱいな話あるの?
昔のファミコンソフトがスーパーテクニックの塊だった、みたいな

最近はリソースが潤沢にあって、手抜きのとりあえず動くプログラムが蔓延しているのだと思ってた
2018/09/24(月) 23:43:30.13ID:CvpxIDb80
今でもゲーム系はスーパーテクニック満載でしょ
マルチコアCPUを90%以上使い倒す世界だからな、すげーわ
2018/09/24(月) 23:47:03.19ID:XuY/8j5Q0
>>732
自分は半端者なんで知識はアレだけど、GTAシリーズとかEAのゲームとか
ああいうのは今でもリソース必死に使い切ってるみたいよ
(Game Programming Gemsとか読んでみたらその片鱗が見える)
スーファミ時代のような変態的なのとは方向性が違ってきてるけど
大規模な開発の上でいかにパフォーマンス損なわずに開発効率を上げるかが重視されてる

もちろん2Dのスマホゲーだったら全然使い切る必要ないだろうけど、そっち方面は詳しくない
(多分言語もC#かSwiftが主流?移植性考えたらC#だろうな
2018/09/25(火) 00:00:26.48ID:C9Mx85q+H
へぇ〜〜〜面白い

「どの業界は超人多い」みたいのあるんだろうか
2018/09/25(火) 00:05:28.27ID:bpDEi/Vx0
個人的にはF-35のソースが読んでみたいw
2018/09/25(火) 06:17:40.32ID:NMIb1H0N0
>>736
さすがにF35のソースは見たことないけど、軍事関係や命に関わるコードはむしろ枯れた技術以外使わないんじゃないかな?
ECUとかはとんでもなく古い考え方(ほぼ全ての変数がグローバル)で作られてるし。
まぁECUの場合それはそれでちゃんと理由があるんだけどね。
2018/09/25(火) 06:26:38.28ID:cr5GGQ8dr
多次元配列クラス Tensor があるとして、そのインスタンス a は a[2][5][3] のように要素アクセスできるとします。

unique_ptr<Tensor> pa(new Tensor);
のように Tensor のスマートポインタを作った場合、pa の指してる Tensor への要素アクセスってどうやるのでしょうか。

「Tensor」の設計の詳細が必要であれば、boost の multi_array と同じとしていただいて問題ありません。
2018/09/25(火) 07:37:41.21ID:ovBx3cXW0
(*pa)[2][5][3]
2018/09/25(火) 08:18:12.28ID:fJAN4SxzM
>>731
自分は業務でC++使ってないのでそういう経験ができないのです‥
だからこそネットで活動してる人しか分からなくて‥

C++は全て独学するしかなくて、いい方法が無いかずっと考えてるのですが、結局ネットや本を見るしかなかったです
2018/09/25(火) 12:20:54.85ID:h/rPVSH9r
>>739
すみません……
いろんなところにアスタリスクつけたり矢印つけたりしてみたのですが、そのパターンは見落としてました……
2018/09/25(火) 12:31:36.38ID:HAbRzuEs0
>>741
見落とすというか……
予め正解を知っておかないと思い付くのは難しいかもしれない
そしてC++ではなくC言語的な原始的なポインタの話になるので、C++の教科書にそこまで詳しく載ってるかと言うと……

ttp://d.hatena.ne.jp/licheng/20130829/p2
ttp://www.nurs.or.jp/~sug/soft/tora/tora10.htm
ttp://tecmemo.wpblog.jp/2016/09/10/cpp-multidimensional_array/
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03010.html
2018/09/25(火) 13:46:02.72ID:rTSM83rL0
>>737
組み込み系のノウハウなんだろうけど、大規模な組み込みってなってくると
一体どんな英知が詰まってるのかなーとか気になって
数百万行とかじゃなかったっけ・・
まぁMISRA-C++嫁、で終わる話かもしれんけどw

>>740
自分も会社入る前とか、辞めて休業中は全部独学よ
C++の知識だけに留まらず、何か作りたいもの作ってれば、
その分野での知識が嫌でもついてくると思う
C++の知識だけに閉じこもって実際の開発(プロじゃなくて個人のフリーソフトでも)と
乖離した方向に行ってしまうのが一番怖い
2018/09/25(火) 13:48:52.76ID:rTSM83rL0
そういえば以前ここで似たようなこと言ったら
「愚者は経験に学び、賢者は歴史に学ぶ」とか言われたなw
ああいうアホになるんだよ、言語の知識だけに閉じこもって何も開発せずにいると
2018/09/25(火) 20:49:31.31ID:ovBx3cXW0
人は繰り返し、神は再帰する
2018/09/25(火) 21:21:29.13ID:CZcrESgD0
>>743
>MISRA-C++
そんなものがあるのですか?
2018/09/25(火) 21:28:11.49ID:LXnmrKE+0
>>746
ggrks
2018/09/25(火) 22:53:16.70ID:uqsQEMjV0
>>689
>(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
>全体のデザインが定まらない。
無いメソッドを呼べる言語は存在しないからこれは仕方が無い(ジャバに限らん
ジャバに限らずインターフェースには利用者が絶対呼ぶメソッドだけではなく、
呼ぶかもしれないメソッドも全部packing listに入れねばならない点が無駄が大きい

その代わり、インターフェースのメソッドはビルド単位内で一意な名前(インターフェース名)で
(直接的あるいは間接的に)修飾されるから、同じメソッド名で違う機能のやつがあっても
衝突せず、安全性が保たれる
テンプレートはこの点だけがちょっと劣る
これ以外にテンプレートに欠点など無i
2018/09/26(水) 00:16:16.58ID:XAX5fYE80
バイナリインターフェースが重要なシステムもあるわけで
2018/09/26(水) 13:25:47.21ID:3bFkpdGnM
C++とシェルスクリプトの違いって何ですか?
シェルスクリプトで出来ることでC++ができないこと
C++が出来てシェルスクリプトで出来ないこととかそういう具体例を教えてほしいです。
2018/09/26(水) 13:28:14.24ID:3bFkpdGnM
>>750
個人的に上げるとしたら、webのフロントエンド分野はインタプリタに勝てないと思います
2018/09/26(水) 13:35:28.26ID:8zK/b6uE0
比較の対象が違い杉
2018/09/26(水) 13:35:54.34ID:NuaJwewid
>>750
C++はコンパイルしないと動かない。シェルスクリプトはファイルの操作やバッチ処理が得意。
2018/09/26(水) 14:01:36.87ID:3yW6iUgn0
>>750
デバドラをスクリプトで書いてみてくれ
2018/09/26(水) 14:29:30.26ID:lYIfIhjTx
>>750
桃白白とラウチェン、マジンガーZとテコンVぐらい違う。
2018/09/26(水) 14:43:50.80ID:zEt8XtGI0
>>750
GUI使ったアプリはシェルスクリプトでは無理
2018/09/26(水) 14:51:55.15ID:3bFkpdGnM
>>753
確かにファイルの操作はそうですね
>>754
確かにそういう分野はCですね
>>755
例えが古くてパッとしませんでした‥
>>756
確かにOSにインストールするものはそうですね
2018/09/26(水) 15:12:38.31ID:nKPhFdqbH
C++というかオブジェクト指向の質問かもしれないんですけど
エクセルにデータを書き出すためのクラスがありましてメソッドがざっとこんな感じ

・データをファイルから読み込む
・シート作成(ここで以下のメソッドを呼び出す)
・シートAに書き出す
・シートBに書き出す

・シートEに書き出す

全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
ただ正直あまり意味が無いような気もするんですよ。クラスと言うには小さすぎるものになりそうですし。
何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
2018/09/26(水) 15:23:36.10ID:dRFURWqC0
それは単に

メソッド シート作成(){
シートAに書き出す
シートBに書き出す

シートEに書き出す
}

ということ?それとも

class A {
メソッド シート作成(){
シートAに書き出す
}

class B {
メソッド シート作成(){
シートBに書き出す
}

ということ?
前者ならクラス分ける意味がないと思うが。
2018/09/26(水) 15:33:15.98ID:3yW6iUgn0
>>756
Tcl/Tk の立場は?
2018/09/26(水) 19:56:11.35ID:oECBSnBC0
クラスは行数じゃなくて意味的にまとまってるかどうかだからな
意味のあるメンバがまとまってれば1万行の単一クラスがあってもいいし
デタラメに寄り集められた50行の粗大ゴミクラスもある
そういうもの
2018/09/26(水) 20:09:57.19ID:LRnZd7JJa
>>761
数字が逆じゃないか?
2018/09/26(水) 20:16:07.55ID:ME0063O80
>>758
>何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
ないよ
機能で分けれ

>例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
「書く内容を決める」機能が「シートに書く」機能を継承するなんてナンセンス
どのシートに書くかなんて「シートに書く」機能に引数で渡せばいいだけ
2018/09/26(水) 20:55:21.65ID:oECBSnBC0
>>762
あってるよ
50行でも粗大ゴミは作れちゃうんだよ
2018/09/27(木) 00:26:48.70ID:zZL/tnLy0
さすがに一万行でまとまってるクラスってのはないわ。。
766デフォルトの名無しさん (ワッチョイ 5780-q1nr)
垢版 |
2018/09/27(木) 00:28:50.85ID:pq96CSzd0
もしかして知恵遅れは
なんか書くために毎度毎度ofstreamを継承すんの

もしかして知恵遅れは
なんか読むために毎度毎度ifstreamを継承すんの

さすが
2018/09/27(木) 00:36:33.47ID:3iNJ0doV0
例えば、基本クラスに出力クラスを作って、
派生クラスに、プリンター・PDF など、機能が異なるならオブジェクト指向だけど、

機能が同じなら、派生クラスではない。
単に、属性・メンバ変数が変わるだけ
768デフォルトの名無しさん (ワッチョイ 5780-q1nr)
垢版 |
2018/09/27(木) 00:50:27.91ID:pq96CSzd0
void aho::write(ostream& aho) const {
aho << "aho" << endl;
aho << "baka" << endl;
aho << "manuke" << endl;
}

こんな感じで作っとけば
いろんなもんに書ける可能性がある

抽象化をうまく利用するというのは
こういうことだからな
2018/09/27(木) 05:39:28.23ID:DR3ASZ+QH
江添亮に匿名で質問ができて、高確率で答えが帰ってくる空間ってもうないのでしょうか
2018/09/27(木) 07:33:12.06ID:zZL/tnLy0
本人のtwitterにでも投げれば?
高確率で「質問ではない」が帰ってくるが。
2018/09/27(木) 07:58:37.31ID:GSDkLsyd0
>>750
シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
C++からならできる
つまりシェルスクリプトだけでは金輪際できない仕事というのは少なくとも1つある

もっともこの宇宙自体がシェルスクリプト上で走っているシミュレーションなら話は別やが…
■ このスレッドは過去ログ倉庫に格納されています