探検
C++相談室 part152
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/07/12(日) 13:42:20.13ID:TX1mpKr6131デフォルトの名無しさん
2020/08/23(日) 17:28:17.74ID:PNDTq65a132デフォルトの名無しさん
2020/08/23(日) 17:29:06.23ID:PNDTq65a133デフォルトの名無しさん
2020/08/23(日) 17:31:18.68ID:PNDTq65a 訂正2、。n_
>>130 正:
std::vector<std::vector<std::string>> x("Hello");
と書いたら
std::vector<std::vector<std::string> > x("Hello");
とコンパイラに解釈させる方がよっぽど凶悪
>>130 正:
std::vector<std::vector<std::string>> x("Hello");
と書いたら
std::vector<std::vector<std::string> > x("Hello");
とコンパイラに解釈させる方がよっぽど凶悪
134デフォルトの名無しさん
2020/08/23(日) 17:39:05.76ID:SVuEjc7r >>131
C++の場合、辞書の参照も簡単では有りません。
namespaceや、クラススコープの名前などが複雑に絡み、
スコープ演算子を使った、修飾名などがあり、
Q1::Q2::Q3::name<xxx>
のような場合がありますが、
ややこしいのは、実際に template を展開してみないことには、nameがどういう識別子
なのかも分からない事があることです。例えば、
aaa<xxx>::bbb<yyyy>::name < 5, 5 > y
と有った場合、name が変数名なのか、template 名なのかによって、
< が template 引き数の始まりなのか、比較演算子なのかが決まる可能性があります。
ただ、この場合、> の後に名前トークン y が来ていますが、template展開だと
すると、この並びは恐らく、必ず間違いであるはずで、比較演算子でしか
合法にはならないと思います。
C++の場合、辞書の参照も簡単では有りません。
namespaceや、クラススコープの名前などが複雑に絡み、
スコープ演算子を使った、修飾名などがあり、
Q1::Q2::Q3::name<xxx>
のような場合がありますが、
ややこしいのは、実際に template を展開してみないことには、nameがどういう識別子
なのかも分からない事があることです。例えば、
aaa<xxx>::bbb<yyyy>::name < 5, 5 > y
と有った場合、name が変数名なのか、template 名なのかによって、
< が template 引き数の始まりなのか、比較演算子なのかが決まる可能性があります。
ただ、この場合、> の後に名前トークン y が来ていますが、template展開だと
すると、この並びは恐らく、必ず間違いであるはずで、比較演算子でしか
合法にはならないと思います。
135デフォルトの名無しさん
2020/08/23(日) 17:40:50.98ID:08jUbd/H いつもの人か
136デフォルトの名無しさん
2020/08/23(日) 17:49:20.95ID:VT3zweO2 >>127
どのテンプレートが使われるかの判断は意味解析だろうけど、テンプレートの使用か
比較式かの区別は構文解析段階で確定するはずだがね。
で、両方に解釈できるケースは基本的に非templateとみなすことになっていて、そこで
テンプレートを使用したいならばtenplateキーワードを追加する。
どのテンプレートが使われるかの判断は意味解析だろうけど、テンプレートの使用か
比較式かの区別は構文解析段階で確定するはずだがね。
で、両方に解釈できるケースは基本的に非templateとみなすことになっていて、そこで
テンプレートを使用したいならばtenplateキーワードを追加する。
137デフォルトの名無しさん
2020/08/23(日) 18:14:03.07ID:PNDTq65a >>136
>両方に解釈できるケースは基本的に非templateとみなすことになっていて、
それだと構文解析時のBNFの当てはめ時点でバックトラックしているように読めてしまうま、
そのような方式は、テンプレート定義が入れ子になったときバックトラック回数が指数関数的になりかねないから近畿
実際はそんなことはせずに、「name」というテンプレートの定義が辞書にあれば、「name」とかかれたソースコードの部分が
<テンプレート名>という字句として文法パーサに入力される、という方式で実現しており、
字句解析→文法解析、の一本道が保たれているはず(つまりは>>128のやり方
>>134
辞書の参照が難しい、と仰せなのですが
識別子のスコープを辞書の階層化で表現するのは常套手段であってコンパイラの教科書にも書いてある
(と思う)のでそんなに難しい話とはみなすことはできない(希ガス
>両方に解釈できるケースは基本的に非templateとみなすことになっていて、
それだと構文解析時のBNFの当てはめ時点でバックトラックしているように読めてしまうま、
そのような方式は、テンプレート定義が入れ子になったときバックトラック回数が指数関数的になりかねないから近畿
実際はそんなことはせずに、「name」というテンプレートの定義が辞書にあれば、「name」とかかれたソースコードの部分が
<テンプレート名>という字句として文法パーサに入力される、という方式で実現しており、
字句解析→文法解析、の一本道が保たれているはず(つまりは>>128のやり方
>>134
辞書の参照が難しい、と仰せなのですが
識別子のスコープを辞書の階層化で表現するのは常套手段であってコンパイラの教科書にも書いてある
(と思う)のでそんなに難しい話とはみなすことはできない(希ガス
138デフォルトの名無しさん
2020/08/23(日) 18:17:01.07ID:PNDTq65a ※ 個人の感想です
139デフォルトの名無しさん
2020/08/23(日) 19:31:26.00ID:OrwVzT4b <=>演算子はどうなん
140デフォルトの名無しさん
2020/08/23(日) 20:00:57.91ID:L0YhmUmF 面白そうな議論だけど忙しくて参加できない(泣
141デフォルトの名無しさん
2020/08/23(日) 21:32:54.31ID:MKE8ZoLo C++の文法は複雑すぎて構文解析と意味解析を分離できないのは有名な話
例によってBoostさんがそれを最大限に悪用してるのも有名な話
https://dechimal.hatenadiary.com/entry/20090216/1234793122
例によってBoostさんがそれを最大限に悪用してるのも有名な話
https://dechimal.hatenadiary.com/entry/20090216/1234793122
142デフォルトの名無しさん
2020/08/24(月) 09:07:54.59ID:2j0RwZQH 構造体へのファイル読み込みについて、悩んでいます。
今まで#pragma pack(x)を使用して、構造体にパディングが入らないようにしていたのですが、これ以外にパディングが入らないようにする方法はあるのでしょうか?
移植性の面からpragma禁止、かつ暗黙アラインメント禁止(自分でパディングを入れる)という指示がありました。
今まで#pragma pack(x)を使用して、構造体にパディングが入らないようにしていたのですが、これ以外にパディングが入らないようにする方法はあるのでしょうか?
移植性の面からpragma禁止、かつ暗黙アラインメント禁止(自分でパディングを入れる)という指示がありました。
143デフォルトの名無しさん
2020/08/24(月) 09:12:28.05ID:hO98kfNk メンバ1つずつ個別に入出力
C++はそれがしやすい
C++はそれがしやすい
144デフォルトの名無しさん
2020/08/24(月) 09:14:54.89ID:hO98kfNk エンディアン問題は1バイトずつ入出力することで解決できる
145デフォルトの名無しさん
2020/08/24(月) 10:43:50.34ID:seWRIuQk 自分でパディングを入れる方が、明確。
解釈の余地がなくなるから
構造体へのファイル読み込みって、
構造体には、文字列のポインターがあるだけだろ
可変サイズの文字列の実メモリは、構造体内には確保しないだろ
解釈の余地がなくなるから
構造体へのファイル読み込みって、
構造体には、文字列のポインターがあるだけだろ
可変サイズの文字列の実メモリは、構造体内には確保しないだろ
146デフォルトの名無しさん
2020/08/24(月) 10:50:48.29ID:3u4r+xiS そもそもの話の流れの趣旨とは無関係
struct hoge {
char mojiretsu[0];
} hage;
で malloc するときに
struct hoge *p = (struct hoge *)malloc(sizeof(struct hoge) + length + 1);
struct hoge {
char mojiretsu[0];
} hage;
で malloc するときに
struct hoge *p = (struct hoge *)malloc(sizeof(struct hoge) + length + 1);
147デフォルトの名無しさん
2020/08/24(月) 11:20:42.08ID:RW1y5ZfB148デフォルトの名無しさん
2020/08/24(月) 11:25:15.19ID:hO98kfNk C++的には構造体の中の物理的な配置に依存しない設計をするのが本筋
ostream& operator << (ostream&, your_struct const&);
istream& operator >> (istream&, your_struct&);
ostream& operator << (ostream&, your_struct const&);
istream& operator >> (istream&, your_struct&);
149デフォルトの名無しさん
2020/08/24(月) 11:51:04.72ID:2j0RwZQH ありがとうございます。とても参考になります。
パッと見て理解できないこともありますが、一つ一つ勉強します。
「入出力部分を切り出し」については、知識不足でイメージもできない状態なのですが、入社したらそうなっているのかも?と心構えというか、理解しておきたいと思います。
パッと見て理解できないこともありますが、一つ一つ勉強します。
「入出力部分を切り出し」については、知識不足でイメージもできない状態なのですが、入社したらそうなっているのかも?と心構えというか、理解しておきたいと思います。
150デフォルトの名無しさん
2020/08/24(月) 12:08:08.35ID:5d5vIMqX >>142
自分でパディングいれろ、という指示なんだから自分パディング入れればいいんでしょ?
方法は明確じゃん
まぁお前の質問の仕方が悪いってことね
まずやることはコンパイラのパディングのルールを確認してどういう条件で暗黙パディングが入るか理解すること
理解できたら自分でダミーのメンバ追加して暗黙パディングが入らないようにする
gcc/clangだったら-wpaddedで暗黙パディングが検出できるはず
念のためstatic_assertとoffsetofを使ってすべてのメンバーで期待通りのオフセットであること保証しておくといい
おまけでstatic_assertとsizeofで期待通りの構造体のサイズであることも
こういうのが多数あるんだったら、別途ツール使って構造体のソースは自動生成するようにすべき
あとpragma packは(レイアウトによって)実行時にオーバーヘッドが生じるってことも勉強しとくといい
自分でパディングいれろ、という指示なんだから自分パディング入れればいいんでしょ?
方法は明確じゃん
まぁお前の質問の仕方が悪いってことね
まずやることはコンパイラのパディングのルールを確認してどういう条件で暗黙パディングが入るか理解すること
理解できたら自分でダミーのメンバ追加して暗黙パディングが入らないようにする
gcc/clangだったら-wpaddedで暗黙パディングが検出できるはず
念のためstatic_assertとoffsetofを使ってすべてのメンバーで期待通りのオフセットであること保証しておくといい
おまけでstatic_assertとsizeofで期待通りの構造体のサイズであることも
こういうのが多数あるんだったら、別途ツール使って構造体のソースは自動生成するようにすべき
あとpragma packは(レイアウトによって)実行時にオーバーヘッドが生じるってことも勉強しとくといい
151デフォルトの名無しさん
2020/08/24(月) 12:32:35.65ID:2j0RwZQH すみません。質問を正しく説明できるように気をつけます。
私が質問したかったのは、「パディングの入れ方」ではなく、「そもそもパディングが入らないようにする方法はないだろうか」ということでした。
パディングの入れ方については既に理解しているのですが、入るとやや都合が悪い状況です。
「暗黙アラインメント禁止(自分でパディングを入れる)」と書いてしまったことで質問内容がブレてしまい、良くなかったと反省しております。
また、詳しくアドバイスをしていただきありがとうございます。
私が質問したかったのは、「パディングの入れ方」ではなく、「そもそもパディングが入らないようにする方法はないだろうか」ということでした。
パディングの入れ方については既に理解しているのですが、入るとやや都合が悪い状況です。
「暗黙アラインメント禁止(自分でパディングを入れる)」と書いてしまったことで質問内容がブレてしまい、良くなかったと反省しております。
また、詳しくアドバイスをしていただきありがとうございます。
152デフォルトの名無しさん
2020/08/24(月) 13:32:36.10ID:3u4r+xiS #pragma pack(1)
も禁止?
も禁止?
153デフォルトの名無しさん
2020/08/24(月) 14:16:40.36ID:5d5vIMqX >>151
「そもそもパディングが入らない方法」がpragma packであって、それが禁止されてんでしょ?
言われた通りに明示的にパディング入れな
何か方法があったとしてもチーム開発しているときに、妙な小細工は嫌われる
「そもそもパディングが入らない方法」がpragma packであって、それが禁止されてんでしょ?
言われた通りに明示的にパディング入れな
何か方法があったとしてもチーム開発しているときに、妙な小細工は嫌われる
154デフォルトの名無しさん
2020/08/24(月) 14:23:21.21ID:2j0RwZQH 「#pragmaは禁止」とあったので、そうだと判断しています。
もしこれが必ずしも#pragma pack(1)も禁止というわけではないなら、一度担当者に確認してみようと思います。
もしこれが必ずしも#pragma pack(1)も禁止というわけではないなら、一度担当者に確認してみようと思います。
155デフォルトの名無しさん
2020/08/24(月) 14:33:52.11ID:2j0RwZQH >>153
ありがとうございます。
そのようにしようと思います。
様々なアドバイスをいただき、私の考え方や疑問に思う部分が誤っていたと感じました。
これからはもっと広い視野で考えられるように頑張ります。
ありがとうございます。
そのようにしようと思います。
様々なアドバイスをいただき、私の考え方や疑問に思う部分が誤っていたと感じました。
これからはもっと広い視野で考えられるように頑張ります。
156蟻人間 ◆T6xkBnTXz7B0
2020/08/24(月) 14:38:21.49ID:lUUB+Gis #include <pshpack1.h>
157デフォルトの名無しさん
2020/08/24(月) 20:32:07.30ID:0b6x/pxR 環境依存しない方法なんてないよ
int, short, longのバイト数すら環境依存なんだから
環境依存が嫌ならC++使うこと自体が間違い
int, short, longのバイト数すら環境依存なんだから
環境依存が嫌ならC++使うこと自体が間違い
158デフォルトの名無しさん
2020/08/24(月) 20:39:16.80ID:hO98kfNk #include <cstdint>知らなさそうだね
159デフォルトの名無しさん
2020/08/25(火) 00:20:38.83ID:GVKOVEUV 明示的にパディング入れる方がかえって小細工になったりして…
パディング前:
struct Foo {
int16_t m_someWord;
// ここに明示的にパディングを入れる
int32_t m_someDoubleWord;
int16_t GetSomeWord() const { return m_someWord; }
};
明示的パディング後(1):
struct Foo {
int32_t m_someWordInDWord; // 32 bit境界に隙間無くパディング入ったやたー!
int32_t m_someDoubleWord;
int16_t GetSomeWord() const { return (m_someWordInDoubleWord >> 16); } // OOPS! 欲しい16 bitの位置がホストのエンディアン次第で変わるorz
};
明示的パディング後(2):
struct Foo {
uint8_t m_someWordInBytes[4]; // 32 bit境界に隙間無くパディング入ったやたー!今度はしくじらないのですよ
int32_t m_someDoubleWord;
int16_t GetSomeWord() const { return ((uint16_t)m_someWordInBytes[1] << 16) | (uint16_t)m_someWordInBytes[0]; } // |||OTL
};
パディング前:
struct Foo {
int16_t m_someWord;
// ここに明示的にパディングを入れる
int32_t m_someDoubleWord;
int16_t GetSomeWord() const { return m_someWord; }
};
明示的パディング後(1):
struct Foo {
int32_t m_someWordInDWord; // 32 bit境界に隙間無くパディング入ったやたー!
int32_t m_someDoubleWord;
int16_t GetSomeWord() const { return (m_someWordInDoubleWord >> 16); } // OOPS! 欲しい16 bitの位置がホストのエンディアン次第で変わるorz
};
明示的パディング後(2):
struct Foo {
uint8_t m_someWordInBytes[4]; // 32 bit境界に隙間無くパディング入ったやたー!今度はしくじらないのですよ
int32_t m_someDoubleWord;
int16_t GetSomeWord() const { return ((uint16_t)m_someWordInBytes[1] << 16) | (uint16_t)m_someWordInBytes[0]; } // |||OTL
};
160デフォルトの名無しさん
2020/08/25(火) 07:35:37.57ID:IvfDNlgu int16_tが欲しいのに他の型使ったらそりゃ。
161デフォルトの名無しさん
2020/08/25(火) 09:32:18.95ID:ILy/WoQ4 逆だな。
C言語を使うといくらでも環境依存のものを作れそうな気持ちにさせる
C言語を使うといくらでも環境依存のものを作れそうな気持ちにさせる
162デフォルトの名無しさん
2020/08/25(火) 09:50:55.63ID:DOmxfygr 環境非依存て聞こえはいいけど色んな機種の機能の積集合でできることだかんな
163デフォルトの名無しさん
2020/08/25(火) 10:21:10.89ID:z55E+4lG Unix文化とWindows文化の違いがあって、
Unixでは、OSよりもC言語によって、ハードウェアの違いを吸収する思想だった。
この思想では、バイナリ互換ではなく、ソース互換を目指し、
異なるOSやCPUに対しても、Cのソースを再コンパイルして対応しようとした。
一方、Windows文化では、最初から互換性のあるCPUを使うことが前提であり、
OSがCPU以外のハードウェアの違いを吸収することで、バイナリレベルで互換性を
維持する思想であった。
この思想では、異なるOSやCPUをターゲットにすることは想定されていない変わりに、
ハードウェアの違いは、互換性のある(単一の)OSをハードウェアに乗せることに
よって吸収しようとした。
なので、GNUやgccなど、Unix文化からきたプログラムでは、徹底的に#ifなどで
場合分けして互換性を維持しようとしているのに対し、Windowsから来たプログラム
ではそのような場合分けはしていない。
また、Unix文化でも、#if によってソースを場合分けすることで対応していることが
ほとんどで、何の場合分けも無いソースで対応できている訳ではない。
Unixでは、OSよりもC言語によって、ハードウェアの違いを吸収する思想だった。
この思想では、バイナリ互換ではなく、ソース互換を目指し、
異なるOSやCPUに対しても、Cのソースを再コンパイルして対応しようとした。
一方、Windows文化では、最初から互換性のあるCPUを使うことが前提であり、
OSがCPU以外のハードウェアの違いを吸収することで、バイナリレベルで互換性を
維持する思想であった。
この思想では、異なるOSやCPUをターゲットにすることは想定されていない変わりに、
ハードウェアの違いは、互換性のある(単一の)OSをハードウェアに乗せることに
よって吸収しようとした。
なので、GNUやgccなど、Unix文化からきたプログラムでは、徹底的に#ifなどで
場合分けして互換性を維持しようとしているのに対し、Windowsから来たプログラム
ではそのような場合分けはしていない。
また、Unix文化でも、#if によってソースを場合分けすることで対応していることが
ほとんどで、何の場合分けも無いソースで対応できている訳ではない。
164デフォルトの名無しさん
2020/08/25(火) 11:00:39.10ID:8PaZBEwq [要出典]
165デフォルトの名無しさん
2020/08/25(火) 11:11:45.82ID:Zt9gBA2M htons とか ntohl とか最強
166デフォルトの名無しさん
2020/08/25(火) 12:41:01.28ID:72rzjRbk C++を検索するときの技で上手い方法ありますか?
ググる、アマゾン、図書館での検索など
勉強しようとしても検索できないです
ググる、アマゾン、図書館での検索など
勉強しようとしても検索できないです
167デフォルトの名無しさん
2020/08/25(火) 12:45:40.95ID:KRGfI1UY コンパイラーのエラー文で投げたら大抵その言語で釣れると思うけどなぁ
168デフォルトの名無しさん
2020/08/25(火) 12:56:51.05ID:qQcORjN3 ぐぐるときは
hoge -ruby -java -javascript -php -sejuku -techacademy -teratail
hoge -ruby -java -javascript -php -sejuku -techacademy -teratail
169デフォルトの名無しさん
2020/08/25(火) 13:08:39.95ID:3B5pz6IO −ヤフーゴミ袋
170デフォルトの名無しさん
2020/08/25(火) 13:10:33.24ID:V6jdFuMQ >>166
検索して出てきた情報を理解するための基礎的な力が無いんじゃね?
ググれば何でも即解決できるわけではないよ
愚直にC++の入門書を買って順を追って系統立てて、C++の基本的な概念や用語を理解していく必要がありそう
もしかすると、C++より前に他の言語でそれをやってプログラミングの基本的なところから土台を踏み固めておかないとダメかも
検索して出てきた情報を理解するための基礎的な力が無いんじゃね?
ググれば何でも即解決できるわけではないよ
愚直にC++の入門書を買って順を追って系統立てて、C++の基本的な概念や用語を理解していく必要がありそう
もしかすると、C++より前に他の言語でそれをやってプログラミングの基本的なところから土台を踏み固めておかないとダメかも
171デフォルトの名無しさん
2020/08/25(火) 13:25:38.78ID:YCpmFLs5 「勉強」がどのレベルなのか分からないとなんとも言えない
直感で言うとC++の入門書なんでもいいから一冊買ってやりなさい
直感で言うとC++の入門書なんでもいいから一冊買ってやりなさい
172はちみつ餃子 ◆8X2XSCHEME
2020/08/25(火) 13:56:10.27ID:xuORV4zd173デフォルトの名無しさん
2020/08/25(火) 14:26:43.50ID:72rzjRbk 「C++」で検索ができないんだが
PCの設定がダメなのかな
これから情報を得るために検索くらいしたいんだけど
本買いたくても出てこない
図書館へは行ったけどC++は貸出中で予約も数件入ってるらしい
+のフォントが変なのか?
PCの設定がダメなのかな
これから情報を得るために検索くらいしたいんだけど
本買いたくても出てこない
図書館へは行ったけどC++は貸出中で予約も数件入ってるらしい
+のフォントが変なのか?
174デフォルトの名無しさん
2020/08/25(火) 14:29:17.40ID:y+wyfPxz >>168
-qiitaが抜けてる
-qiitaが抜けてる
175はちみつ餃子 ◆8X2XSCHEME
2020/08/25(火) 14:32:45.54ID:xuORV4zd176デフォルトの名無しさん
2020/08/25(火) 14:43:38.93ID:z55E+4lG twitter は、C++ や C# を検索できない。"C++" や "C#" としても駄目。
なので、cpp OR cplusplus とすると良いと言われているが、
個人的には、これは、twitter を作った人の C++ や C# を弱まらせるための策略
だと思っている。
なので、cpp OR cplusplus とすると良いと言われているが、
個人的には、これは、twitter を作った人の C++ や C# を弱まらせるための策略
だと思っている。
177デフォルトの名無しさん
2020/08/25(火) 14:49:20.21ID:8QbTjnzx なんか流れにしれっとキチガイ混じっとるな
178デフォルトの名無しさん
2020/08/25(火) 14:50:58.98ID:H1PjAHfj アメリカはそういう国で、
彼らは、自分のためなら何をやっても文句は言わせない的な心持でいる。
彼らは、自分のためなら何をやっても文句は言わせない的な心持でいる。
179デフォルトの名無しさん
2020/08/25(火) 14:57:06.54ID:72rzjRbk180デフォルトの名無しさん
2020/08/25(火) 15:16:32.29ID:YCpmFLs5 勘違いで御高説垂れてた奴wwww
181デフォルトの名無しさん
2020/08/25(火) 20:28:52.64ID:Ascep3nh 何故かyahooでリアルタイム検索ではC++で検索できる
182デフォルトの名無しさん
2020/08/25(火) 23:48:37.58ID:zCjig7ks シープラプラとか
チンチンブラブラみたいな名前付けやがって
たぬき砲でいいよなもう
チンチンブラブラみたいな名前付けやがって
たぬき砲でいいよなもう
183デフォルトの名無しさん
2020/08/25(火) 23:56:18.23ID:zCjig7ks Cよりもちょっと背伸びした意識高い系狙ってみましたみたいなキモいネーミングセンス
184デフォルトの名無しさん
2020/08/26(水) 00:15:37.56ID:DrItK79l185デフォルトの名無しさん
2020/08/26(水) 00:16:50.63ID:1Tu0I/K+ あーキモい(゚〇゚)キモい
186はちみつ餃子 ◆8X2XSCHEME
2020/08/26(水) 01:00:49.72ID:Yn/rXsvn キーッ! もういい! (駄洒落)
187デフォルトの名無しさん
2020/08/26(水) 01:32:11.23ID:NYX2/iU2 CRTP(奇妙に再帰したテンプレートパターン)ってどんなときに使うの?
template <class Derived>
struct Base {
static void interface() {
...
Derived::static_interface();
...
}
};
struct Hoge : Base<Hoge> {
static void static_interface() { ... }
};
通常の継承とは依存関係が逆になってるというのはわかるけど
具体的にどんなケースで便利なのかいまいちピンとこない...
template <class Derived>
struct Base {
static void interface() {
...
Derived::static_interface();
...
}
};
struct Hoge : Base<Hoge> {
static void static_interface() { ... }
};
通常の継承とは依存関係が逆になってるというのはわかるけど
具体的にどんなケースで便利なのかいまいちピンとこない...
188デフォルトの名無しさん
2020/08/26(水) 02:37:52.45ID:oEB3gdtA 速度重視のときじゃないかな。
ATL/WTLがCRTP使ってると思ったけど。
メリットとデメリットを比べるとデメリットが上回ってるような気がするな。
ぼくは構文解析器の合成にCRTPを使いましたが、合成の頻度が非常に少ないので、使った感じです。
ATL/WTLがCRTP使ってると思ったけど。
メリットとデメリットを比べるとデメリットが上回ってるような気がするな。
ぼくは構文解析器の合成にCRTPを使いましたが、合成の頻度が非常に少ないので、使った感じです。
189デフォルトの名無しさん
2020/08/26(水) 02:49:00.89ID:oEB3gdtA 仮想関数の代わりにCRTPを使うと呼び出しコストが無くなる・・・的な使い方で、便利にはならないと思う。
というより、めんどくさくなるだけ。
というより、めんどくさくなるだけ。
190デフォルトの名無しさん
2020/08/26(水) 07:05:25.59ID:NYX2/iU2 なるほどどうしてもパフォーマンスが気になるときに使うものって感じですかね
191デフォルトの名無しさん
2020/08/26(水) 10:20:21.13ID:2Yv7E1bU というより、動的な多態は不要だが静的な多態が必要で、
かつ派生クラスの型情報がどうしても必要なときに使うもんだと思う
クラステンプレートであれこれやってるうちに必要な場面が出てくるかと
かつ派生クラスの型情報がどうしても必要なときに使うもんだと思う
クラステンプレートであれこれやってるうちに必要な場面が出てくるかと
192デフォルトの名無しさん
2020/08/26(水) 11:43:55.11ID:KrF5vX4s 学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
VM + ASM を書いた (C#, DX) * x86 ではない!
simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ
VM + ASM のダウンロード
ttp://up.x0000.net/files/TSimulang.zip
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
VM + ASM を書いた (C#, DX) * x86 ではない!
simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ
VM + ASM のダウンロード
ttp://up.x0000.net/files/TSimulang.zip
193デフォルトの名無しさん
2020/08/26(水) 13:51:37.26ID:CU/Sbvp9 派生クラスの型情報を静的に使うというのはstatic_castでのダウンキャストだな
194デフォルトの名無しさん
2020/08/26(水) 18:43:05.84ID:UQhlb7Hi Derivedを引数にとる比較演算子を生成するみたいなことは継承だと無理そう。
195デフォルトの名無しさん
2020/08/26(水) 19:52:17.80ID:IvFDW58Y 基底と言いつつテンプレートでガッツリ派生型の名前が入ってるわけで
他の派生型を持つ基底を一括してコンテナに入れるとかできないしあまり意味を感じないな
他の派生型を持つ基底を一括してコンテナに入れるとかできないしあまり意味を感じないな
196デフォルトの名無しさん
2020/08/26(水) 23:36:52.30ID:BTqRZu5v そもそもポリモ目的でやるもんじゃないでしょ
基底クラスは結局全部別モンになるわけだし
ボイラープレートコードをまとめたクラスをミックスインするときに使うもの
基底クラスは結局全部別モンになるわけだし
ボイラープレートコードをまとめたクラスをミックスインするときに使うもの
197デフォルトの名無しさん
2020/08/27(木) 06:37:57.11ID:7Sruawh3 >>195
basic_iosとios_baseみたいにテンプレート化する必要のある部分と不要な部分に分けるとか
basic_iosとios_baseみたいにテンプレート化する必要のある部分と不要な部分に分けるとか
198デフォルトの名無しさん
2020/08/28(金) 17:02:52.88ID:BFWbiW8H 関数へのポインタが、メンバ変数に有る場合、例えば、
class CXxx {
public:
void (*pfn)(int a);
void (*pfn)(float b);
};
の様な場合、
pXxx->pfn(5);
pXxx->pfn(10.0f);
とした場合に、関数呼び出しに使われる関数ポインタが自動的に選択されるでしょうか?
つまり、関数ポインタについても、関数と同様な「オーバーロード解決」が行われますか?
そもそも、上の様なクラスは、定義時にエラーになるでしょうか?
class CXxx {
public:
void (*pfn)(int a);
void (*pfn)(float b);
};
の様な場合、
pXxx->pfn(5);
pXxx->pfn(10.0f);
とした場合に、関数呼び出しに使われる関数ポインタが自動的に選択されるでしょうか?
つまり、関数ポインタについても、関数と同様な「オーバーロード解決」が行われますか?
そもそも、上の様なクラスは、定義時にエラーになるでしょうか?
199デフォルトの名無しさん
2020/08/28(金) 17:09:28.47ID:47MLab1u 自分で動かしてから質問しろよ
200デフォルトの名無しさん
2020/08/28(金) 17:09:34.31ID:namGYget 同じ名前のデータメンバーをふたつ定義してるからアウト
201デフォルトの名無しさん
2020/08/28(金) 17:26:26.84ID:bCpDWR5V >>198
それコンパイル通るかやってみ
それコンパイル通るかやってみ
202デフォルトの名無しさん
2020/08/28(金) 17:41:13.83ID:AJ/VhFe8 ここに質問するより少ない手数で試せるだろうに何やってんだろうね
203デフォルトの名無しさん
2020/08/28(金) 17:44:35.89ID:TvC7lNeF204デフォルトの名無しさん
2020/08/28(金) 17:48:03.23ID:TvC7lNeF ちかっとエスパーすると
class CXxx_base {
public:
virtual void fn(int) = 0;
virtual void fn(float) = 0;
};
class CXxx : public CXxx_base {
public:
void fn(int) override { }
void fn(float) override { }
};
pXxx->fn(5);
pXxx->fn(1.0.f);
これでおまえさんの考えてることはできるんじゃないか?
class CXxx_base {
public:
virtual void fn(int) = 0;
virtual void fn(float) = 0;
};
class CXxx : public CXxx_base {
public:
void fn(int) override { }
void fn(float) override { }
};
pXxx->fn(5);
pXxx->fn(1.0.f);
これでおまえさんの考えてることはできるんじゃないか?
205デフォルトの名無しさん
2020/08/28(金) 19:11:25.34ID:KPVk+Ml/206デフォルトの名無しさん
2020/08/29(土) 11:57:26.58ID:HmjSn9P9 関数へのポインタって関数じゃなくてただのメンバ変数だからな
207デフォルトの名無しさん
2020/08/29(土) 14:38:37.69ID:EjjA84a9208デフォルトの名無しさん
2020/08/30(日) 13:47:11.43ID:6dVOYYO/ 構造体を使った配列の記憶にて
配列に順に入力しても出力が上手くいきません助けて偉い人
配列に順に入力しても出力が上手くいきません助けて偉い人
209デフォルトの名無しさん
2020/08/30(日) 13:49:26.97ID:KF/F+MKa スルーで
210デフォルトの名無しさん
2020/08/30(日) 13:51:20.52ID:GgAZZaQa 100歩譲っておま環
211デフォルトの名無しさん
2020/08/30(日) 14:21:16.52ID:6dVOYYO/ void dataInput(Student& st){
string ans;
for(int i=1, i<=n;i++){
cin>>st.id;
pN[i]=st.id;
cin>>st.ans;
pA[i]=st.ans;
}
};
void showData(Student& st);
int main(){
cin>>n;
pN = new int[n];
pA = new int[n];
Student st;
dataInput(st);
showData(st);
return 0;
}
void showData(Student& st){
for(int j=0; j<=n; j++){
cout << pN[j] << pA[j] << "\n";
}
}
定義はファイル別にしてある
正直すまんかった
string ans;
for(int i=1, i<=n;i++){
cin>>st.id;
pN[i]=st.id;
cin>>st.ans;
pA[i]=st.ans;
}
};
void showData(Student& st);
int main(){
cin>>n;
pN = new int[n];
pA = new int[n];
Student st;
dataInput(st);
showData(st);
return 0;
}
void showData(Student& st){
for(int j=0; j<=n; j++){
cout << pN[j] << pA[j] << "\n";
}
}
定義はファイル別にしてある
正直すまんかった
212デフォルトの名無しさん
2020/08/30(日) 14:23:30.40ID:KF/F+MKa デバッガで自分でトレースしろ
213デフォルトの名無しさん
2020/08/30(日) 14:28:47.09ID:GgAZZaQa 死ね
214デフォルトの名無しさん
2020/08/30(日) 14:54:19.28ID:6dVOYYO/ hファイルの方
struct Student{
int id;
char ans;
};
int n;
int* pN;
char* pA;
cppファイル冒頭
#include <iostream>
#include <string>
#include "funk.h"
using namespace std;
struct Student{
int id;
char ans;
};
int n;
int* pN;
char* pA;
cppファイル冒頭
#include <iostream>
#include <string>
#include "funk.h"
using namespace std;
215デフォルトの名無しさん
2020/08/30(日) 15:13:34.04ID:6dVOYYO/ デバッグしたけど問題は見つかりませんでしたと出た。出力に問題があるっぽい
216デフォルトの名無しさん
2020/08/30(日) 15:22:13.56ID:6dVOYYO/ 自己解決しました!iとjの初期値を1から0にしたら解決できました。
217デフォルトの名無しさん
2020/08/30(日) 15:22:13.70ID:6dVOYYO/ 自己解決しました!iとjの初期値を1から0にしたら解決できました。
218デフォルトの名無しさん
2020/08/30(日) 15:57:12.85ID:HKGZh04b きちんと検証しろ
ソレができないなら初心者スレか日記帳にでも書いとけ
ソレができないなら初心者スレか日記帳にでも書いとけ
219デフォルトの名無しさん
2020/08/30(日) 17:44:09.91ID:oWP9MzfY これはひどい
220デフォルトの名無しさん
2020/09/04(金) 17:01:57.31ID:8b49PodW hage
221デフォルトの名無しさん
2020/09/04(金) 17:03:42.03ID:LCYaN/vD どっちのだよ
222デフォルトの名無しさん
2020/09/04(金) 17:11:42.93ID:ML6iv+hM223デフォルトの名無しさん
2020/09/07(月) 16:37:42.90ID:AmzB5PF6 githubなりに落ちてるc++で書かれたアプリなりを読んで勉強しているんだけど、
include無限ループに陥って萎えてしまうのですが、どうしてますか?
mainのinclude沢山→その指定先にもinclude沢山→stlなりのライブラリ(ここは読まずネットでドキュメント読む)
で相当時間食ってしまうまのですけど、コツとかありますか?
include無限ループに陥って萎えてしまうのですが、どうしてますか?
mainのinclude沢山→その指定先にもinclude沢山→stlなりのライブラリ(ここは読まずネットでドキュメント読む)
で相当時間食ってしまうまのですけど、コツとかありますか?
224デフォルトの名無しさん
2020/09/07(月) 16:42:08.11ID:bjXgxZkO includeガードしろ
225デフォルトの名無しさん
2020/09/07(月) 16:54:18.66ID:4QMtZq9v ていうかなぜ初学者なのにいきなりそんな重厚長大なアプリからチャレンジしようとするのか
自分の力量を過大評価しているのではないか
まずヘローワールドとかそういう簡単なとこからはじめなさい
自分の力量を過大評価しているのではないか
まずヘローワールドとかそういう簡単なとこからはじめなさい
226デフォルトの名無しさん
2020/09/07(月) 16:57:38.12ID:x8yvSFtj コンパイル時にg++とかなら-Eオプションつければ
実際のプリプロセッサの処理の結果が確認できる
実際のプリプロセッサの処理の結果が確認できる
227デフォルトの名無しさん
2020/09/07(月) 16:58:04.33ID:3Ozv9Uf+ 読まなきゃいいじゃん
何のために全部読もうとしているのか自問自答したら?
何のために全部読もうとしているのか自問自答したら?
228デフォルトの名無しさん
2020/09/07(月) 17:02:08.59ID:qk/9c7gK >>223
身の丈に合わない巨大なプロジェクトを読もうとしてるか、または愚直に頭から全部読もうとしてないか?
お前さん自身がコンパイラじゃないんだから、頭からすべて把握して読んでいく必要はないぞ。
まともなソースならオブジェクト指向で書かれてるのだから、上位層で大筋を把握しながら必要に応じて深いところに入っていって、有用そうな所や興味があるところだけ詳しく読めば?
ヘッダファイルは使ってるライブラリとかの当たりをつける程度でざっと読み飛ばして、定義を調べたくなったときにIDEの機能で見に行けばいいだろう。
身の丈に合わない巨大なプロジェクトを読もうとしてるか、または愚直に頭から全部読もうとしてないか?
お前さん自身がコンパイラじゃないんだから、頭からすべて把握して読んでいく必要はないぞ。
まともなソースならオブジェクト指向で書かれてるのだから、上位層で大筋を把握しながら必要に応じて深いところに入っていって、有用そうな所や興味があるところだけ詳しく読めば?
ヘッダファイルは使ってるライブラリとかの当たりをつける程度でざっと読み飛ばして、定義を調べたくなったときにIDEの機能で見に行けばいいだろう。
229デフォルトの名無しさん
2020/09/07(月) 17:05:02.17ID:Egt+Qwmp 吊りかも知れないが勉強中とのことなので
マジレスすると
#include の行を一つづつ消してみて(mainに近い方だけ)
消したらどんなコンパイルエラー出るかを観察する
マジレスすると
#include の行を一つづつ消してみて(mainに近い方だけ)
消したらどんなコンパイルエラー出るかを観察する
230デフォルトの名無しさん
2020/09/07(月) 17:07:22.95ID:6+huFxV7 >>228
sshのソース読んでも全くオブジェクト指向じゃないぞ。
sshのソース読んでも全くオブジェクト指向じゃないぞ。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 自民・麻生太郎 副総裁 石破政権の1年は「どよーん」 高市政権の発足で「何となく明るくなった」「世の中のことが決まり動いている」 [Hitzeschleier★]
- 東京都「都民の税金1.5兆円が国に奪われている」「全国に分配されている」に地方民ブチギレ [Hitzeschleier★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 【27歳会社員】「自慰行為に使うために」コインランドリーの乾燥機から24歳女性の下着など計11点(時価8万2080円相当)盗んだ疑い [nita★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★3
- ジャップ「カントの純粋理性批判読むお!!!」⇒全員上巻で挫折 俺恥ずかしいよ…😭 [731544683]
- トランプ、G7に代わるcore 5を発表 [805596214]
- 麻生太郎が石破政権の1年を酷評「どよーんとして何も動かない感じだったな。それに引き換え高市政権は物事が動いている」 [597533159]
- 【速報】室井佑月、米山隆一との離婚を決意wwwwwwwwwwwwwwwwwwww [802034645]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★4
