※前スレ
C++相談室 part154
https://mevius.5ch.net/test/read.cgi/tech/1610096040/
テンプレここまで
探検
C++相談室 part155
レス数が1000を超えています。これ以上書き込みはできません。
2021/03/24(水) 12:07:15.39ID:R+oM8cup
2はちみつ餃子 ◆8X2XSCHEME
2021/03/24(水) 13:01:36.77ID:eNnFQgEr 2get
2021/03/24(水) 13:37:00.67ID:uPqg/PBu
msysの thread_local が、わりとちゃんと動くのがありがたい
昔は当たり前にクラッシュしてた
昔は当たり前にクラッシュしてた
2021/03/24(水) 23:24:56.26ID:DDXRo65G
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
2021/03/25(木) 00:32:41.48ID:BFmdRR/m
たぶん最初に書いた本人以外はだれも気に入ってないと思う
もうやめたほうがいい
もうやめたほうがいい
2021/03/25(木) 13:58:38.53ID:VH1J0VUJ
glslのnoise関数のような、特定の入力に対して、特定の乱数を返すような関数はありますか?C++に
2021/03/25(木) 14:41:00.85ID:Vfj9f3xX
完全に(疑似)乱数でよいのなら、
毎回シード設定すれば入力で一意に決まる乱数値を取得できるけど、それでええのん?
毎回シード設定すれば入力で一意に決まる乱数値を取得できるけど、それでええのん?
2021/03/25(木) 14:43:13.48ID:Vfj9f3xX
例えばこんなの
srand(input);
return rand();
srand(input);
return rand();
2021/03/25(木) 17:26:16.86ID:BFmdRR/m
ハッシュと乱数を混同して質問しているに500ペリカ
2021/03/25(木) 17:48:06.49ID:VH1J0VUJ
12はちみつ餃子 ◆8X2XSCHEME
2021/03/25(木) 18:04:14.88ID:eNzfljpt C++ の乱数生成器 (linear_congruential_engine, mersenne_twister_engine, subtract_with_carry_engine)
は厳密に挙動が定められているので環境によらず同じシードを与えれば同じ乱数列が得られることは保証される。
(余談だが分布生成器 (uniform_int_distribution など) は完全に同一の挙動は保証されない。)
rand は同じシードからは同じ乱数列になるという保証はあるけど、
他の環境に持って行ったとき (別の処理系を使ったとき) に同じになるという保証はない。
乱数の質についても保証がない。
必要な性質がよくわからんのだが、再現性・移植性が重要なら rand はあまりよくない。
は厳密に挙動が定められているので環境によらず同じシードを与えれば同じ乱数列が得られることは保証される。
(余談だが分布生成器 (uniform_int_distribution など) は完全に同一の挙動は保証されない。)
rand は同じシードからは同じ乱数列になるという保証はあるけど、
他の環境に持って行ったとき (別の処理系を使ったとき) に同じになるという保証はない。
乱数の質についても保証がない。
必要な性質がよくわからんのだが、再現性・移植性が重要なら rand はあまりよくない。
2021/03/25(木) 21:06:48.96ID:VH1J0VUJ
自作のXorShiftでやってみようと思います
スレの流れがそんなに速くないようなので後にコードレビューでもお願いするかもです
スレの流れがそんなに速くないようなので後にコードレビューでもお願いするかもです
2021/03/26(金) 07:33:40.04ID:YT9UBnI1
乱数表作るだけだろ
くだらん
くだらん
15はちみつ餃子 ◆8X2XSCHEME
2021/03/26(金) 13:48:17.35ID:OLCpSFIZ コードレビューつってもなぁ、
明らかに未定義を踏んでるとか間違った結果を出力をするとかならともかく、
インターフェイスが綺麗かとか命名が適切がとかいった要素は状況に依存するんで
そこらへんの前提を共有できている状態じゃないと
かなりざっくりした一般論しか言えないと思うよ。
明らかに未定義を踏んでるとか間違った結果を出力をするとかならともかく、
インターフェイスが綺麗かとか命名が適切がとかいった要素は状況に依存するんで
そこらへんの前提を共有できている状態じゃないと
かなりざっくりした一般論しか言えないと思うよ。
2021/03/26(金) 14:17:07.80ID:xeE+mVbe
7ですが、すいませんでした
場違いだったようなのですべて撤回します
場違いだったようなのですべて撤回します
2021/03/26(金) 17:49:14.73ID:Bae43LUT
QZあたりが疑似乱数の理論について本一冊分ぐらい語るのではなかったの???
2021/03/26(金) 17:50:06.84ID:Bae43LUT
乱数表をどうやって作るつもりなのかとそこはかとなく疑問が………
2021/03/26(金) 19:01:34.23ID:Rskx+UE5
ラジウムとガイガーカウンターでも使うんだろ
2021/03/26(金) 20:57:56.27ID:Bae43LUT
ガイガーカウンターは放射線源が強力だとカウントミスりそうであんまり高速な乱数生成に向かない
という印象
という印象
2021/03/26(金) 22:44:42.48ID:Bae43LUT
ていうか量子乱数発生器はスタジアムや野球場など人間が数千人〜数万人規模で集まり
興奮するようなところで量子乱数発生器を使うと乱数発生が偏るという実験結果がある
とモーガンフリーマンが言ってたから信頼できない
やっぱ第一選択はシードを19936ビットフルい与えてのmersenne_twister_engineなのでは……
興奮するようなところで量子乱数発生器を使うと乱数発生が偏るという実験結果がある
とモーガンフリーマンが言ってたから信頼できない
やっぱ第一選択はシードを19936ビットフルい与えてのmersenne_twister_engineなのでは……
2021/03/26(金) 23:42:48.79ID:uaj8R912
ハッシュと乱数を混同してただけでしょ
>>17
大抵の用途には、私は MT を使いますね…
大抵の用途には、私は MT を使いますね…
24はちみつ餃子 ◆8X2XSCHEME
2021/03/27(土) 00:35:45.49ID:Ly0w36WW メルセンヌツイスタは統計的な性質は良いが状態がやや大きい (普通のパソコンではもはや気にしないでよいレベルだが) ので、
いつでも選択するには過剰な気もする。
いつでも選択するには過剰な気もする。
25デフォルトの名無しさん
2021/03/27(土) 00:52:36.37ID:tZBSsbg+ スレの流れをぶった切って申し訳ない
boostってもういらなくなったの?
15年ぶりにC++でプログラミングすることになったので
その辺の事情がよく分かりません
boostってもういらなくなったの?
15年ぶりにC++でプログラミングすることになったので
その辺の事情がよく分かりません
2021/03/27(土) 00:54:27.35ID:3iQ+aU3D
当然要るよ
多次元配列クラスとかまだSTLに入ってない
多次元配列クラスとかまだSTLに入ってない
27はちみつ餃子 ◆8X2XSCHEME
2021/03/27(土) 01:11:01.48ID:Ly0w36WW 個別には Boost 以外の選択肢もあると思うけどある程度に統一されてないと扱いづらいし、
Boost にあるものは Boost を使っておくのが無難な選択には違いないと思うよ。
Boost にあるものは Boost を使っておくのが無難な選択には違いないと思うよ。
2021/03/27(土) 01:17:35.37ID:1M7dxEop
boostはヘッダライブラリ自称してる割にビルド必要で使いづらいねん
29はちみつ餃子 ◆8X2XSCHEME
2021/03/27(土) 01:26:03.40ID:Ly0w36WW30デフォルトの名無しさん
2021/03/27(土) 02:13:45.76ID:FxCpf6Ea ヘッダのみで使えると過剰に宣伝してるライブラリが多い。
と、あわしろ氏が申しておりました。
と、あわしろ氏が申しておりました。
2021/03/27(土) 02:17:07.41ID:p6NWEZH2
あわしろってキンコン西野みたいなもん?
2021/03/27(土) 08:19:32.12ID:MzcivD4R
ビルド必要なのは別にいいけどbjamが糞すぎるからさっさと捨てて欲しい
2021/03/28(日) 12:33:00.93ID:11viivYN
class hoge{
public:
constexpr static int aaa[2] = { 1, 2};
static hoge get_hoge();
}
hage::hage()
{
hoge *_hoge = hage::get_hoge();
int tmp;
int i = 0;
tmp = _hoge->aaa[i];
}
とすると、ビルド時、undefined reference to `hoge::aaa'と出るけど、
tmp = _hoge->aaa[0];とするとエラーが出ない
これってなぜ起きて、どうやったら変数を使ってアクセスできるようになるの?
開発環境はSTM32CubeIDEのver1.6.0
public:
constexpr static int aaa[2] = { 1, 2};
static hoge get_hoge();
}
hage::hage()
{
hoge *_hoge = hage::get_hoge();
int tmp;
int i = 0;
tmp = _hoge->aaa[i];
}
とすると、ビルド時、undefined reference to `hoge::aaa'と出るけど、
tmp = _hoge->aaa[0];とするとエラーが出ない
これってなぜ起きて、どうやったら変数を使ってアクセスできるようになるの?
開発環境はSTM32CubeIDEのver1.6.0
2021/03/28(日) 13:05:07.76ID:hha5l0Ce
ちらちら混ざってる hage は hoge の間違いなのか何か別物なのか。
35はちみつ餃子 ◆8X2XSCHEME
2021/03/28(日) 13:05:58.70ID:IQVnw+L72021/03/28(日) 13:47:16.98ID:5/FvdRpo
>>35
うそやん?
うそやん?
2021/03/28(日) 17:41:23.48ID:11viivYN
2021/03/28(日) 19:20:58.11ID:PRWHgvt6
三段活用はhoge、fuga、piyoだろ!常識だぞ
ハゲとか言う人にはもう教えません
ハゲとか言う人にはもう教えません
2021/03/28(日) 19:23:19.81ID:YX9+FjRw
piyoは初めてみるな
2021/03/28(日) 20:20:31.89ID:W2vCV6FV
2021/03/28(日) 21:37:33.38ID:hha5l0Ce
>>37
> constexpr static int aaa[2] = { 1, 2};
クラススコープの↑は変数の定義に見えるけど実は宣言でしかなくて、プログラム中に実体を置くには別途定義が要る。
ただし const な整数型や constexpr な変数が定数式の文脈で即座に値として利用される場合はコンパイル時に直接定数として
置き換えられるので、定義が無くてもビルドできる。
定数 0 ではなく変数 i を添え時にすると定数式ではなくなるので定義が必要になる。
> constexpr static int aaa[2] = { 1, 2};
クラススコープの↑は変数の定義に見えるけど実は宣言でしかなくて、プログラム中に実体を置くには別途定義が要る。
ただし const な整数型や constexpr な変数が定数式の文脈で即座に値として利用される場合はコンパイル時に直接定数として
置き換えられるので、定義が無くてもビルドできる。
定数 0 ではなく変数 i を添え時にすると定数式ではなくなるので定義が必要になる。
2021/03/28(日) 22:16:07.85ID:11viivYN
>>42
分かったようなわかんないような感じなんだけど、
例えば、
class hoge{
public:
constexpr static int aaa[2];
static hoge get_hoge();
}
hoge::aaa[2] = {1, 2};
みたいにするってこと?
分かったようなわかんないような感じなんだけど、
例えば、
class hoge{
public:
constexpr static int aaa[2];
static hoge get_hoge();
}
hoge::aaa[2] = {1, 2};
みたいにするってこと?
2021/03/28(日) 22:26:27.67ID:hha5l0Ce
>>42
それだと定数評価できなくなるから、たぶんやりたいことと違うよね。
「別途定義」は、宣言の初期化子はそのままで↓をどこかのコンパイル単位に追記するだけでいい。
constexpr int hoge::aaa[];
それだと定数評価できなくなるから、たぶんやりたいことと違うよね。
「別途定義」は、宣言の初期化子はそのままで↓をどこかのコンパイル単位に追記するだけでいい。
constexpr int hoge::aaa[];
44デフォルトの名無しさん
2021/03/28(日) 22:50:05.31ID:R4xh1GwG static constexpr int * constexpr aaa = …
か
static inline constexpr int aaa[] = … (c++17)
で行けんじゃね?知らんけど。
か
static inline constexpr int aaa[] = … (c++17)
で行けんじゃね?知らんけど。
2021/03/28(日) 23:57:42.15ID:hha5l0Ce
そういえば inline 変数で済むようになったんだっけ。 C++17 でビルドすれば別途定義は要らないね。
https://cpprefjp.github.io/lang/cpp17/inline_variables.html
https://cpprefjp.github.io/lang/cpp17/inline_variables.html
2021/03/29(月) 08:44:37.72ID:A8t4nM4q
これで思い出したんだけどメンバ変数のconstexprとstatic constexprに違いってあるんだっけ?
2021/03/29(月) 10:42:44.85ID:4VjYBAI0
メモリ上に唯一ここだけしかないんだぞって見る奴に分かるようにしてるんでしょ
コンパイラ的にはあってもなくても同じ
コンパイラ的にはあってもなくても同じ
2021/03/29(月) 11:13:21.97ID:a9nDQaAf
>>46
メンバ変数はインスタンス無いとあかんやん
メンバ変数はインスタンス無いとあかんやん
4946
2021/03/29(月) 11:39:07.94ID:jFqdjOB1 インスタンスごとになるのか・・コンパイル時定数なのに(保証は無いのかもしれんけど
普段staticつけてるから疑問に思ってたんだ、ありがとう
普段staticつけてるから疑問に思ってたんだ、ありがとう
2021/03/29(月) 16:52:43.90ID:ZAtZtNlj
2021/04/01(木) 00:44:40.92ID:3rw8Xzm0
クラスを使わずにフリー関数だけで何もかも実装してしまう
52はちみつ餃子 ◆8X2XSCHEME
2021/04/01(木) 02:23:28.90ID:zgIDekUq なんでもかんでもクラスに放り込むのは良くないというのはよく認識されるようになってきたみたいだけど、
だからといって C++ を使う以上は非メンバ関数だけで構成するのも不格好だし、いい感じの設計は難しいね。
だからといって C++ を使う以上は非メンバ関数だけで構成するのも不格好だし、いい感じの設計は難しいね。
2021/04/01(木) 05:45:44.25ID:KfB45e5F
知らん馬の骨の好みに合わせる意味はない
2021/04/01(木) 06:17:26.46ID:xkKFGoH+
無駄に上から目線でワロタ
何様のつもりなのかと
何様のつもりなのかと
2021/04/01(木) 11:54:02.32ID:/m7p4qXu
バカが無理してクラス使っても無駄に状態持つだけだから非メンバ関数使っとけ
2021/04/01(木) 14:49:39.84ID:mwubpVbO
ラムダ式で何もかも実装したらクラスを使ったことになる!
2021/04/01(木) 16:14:27.54ID:b0+JHWqP
2021/04/01(木) 16:49:21.83ID:Ga8mQY/B
>>55
永遠に初心者のままだな
永遠に初心者のままだな
2021/04/01(木) 17:27:07.05ID:mwubpVbO
>>58
別に
別に
2021/04/01(木) 18:40:51.78ID:/m7p4qXu
>>58
永遠に関数型理解できないね
永遠に関数型理解できないね
61はちみつ餃子 ◆8X2XSCHEME
2021/04/01(木) 18:42:28.20ID:zgIDekUq メンバ関数を使わなければ関数型的ということはない。
2021/04/01(木) 18:48:20.10ID:/m7p4qXu
嫌味の理解できない奴が話をこじらせる。
2021/04/01(木) 22:02:12.44ID:mwubpVbO
誤解の余地がないぐらいしっかり要件定義できたら一人前の入り口
2021/04/01(木) 23:10:26.56ID:klwu+MWY
なんでもかんでもクラスに放り込むのは良くないけど、なんでもかんで名前空間に放り込むのは実に良い
2021/04/02(金) 01:40:11.97ID:UoCieKPr
ま、せやな
2021/04/02(金) 08:19:46.74ID:U50iDt4R
"Raw string literals" は 「生文字列リテラル」 って訳されるけど、「生」の部分をどう読んでいるのですか?
「なま」なのか「せい」なのか、「しょう」なのか
ググってもわかりません
https://cpprefjp.github.io/lang/cpp11/raw_string_literals.html
「なま」なのか「せい」なのか、「しょう」なのか
ググってもわかりません
https://cpprefjp.github.io/lang/cpp11/raw_string_literals.html
67デフォルトの名無しさん
2021/04/02(金) 08:32:50.23ID:/UxsPKSF 「生ポインタ」で「なまぽいんた」
界隈で使われてる超専門用語
教科書には読み方はおろかその存在すら一切載って無い
しかしてC/C++使いは総じてその読み方を知ってる
界隈で使われてる超専門用語
教科書には読み方はおろかその存在すら一切載って無い
しかしてC/C++使いは総じてその読み方を知ってる
2021/04/02(金) 08:39:51.40ID:U50iDt4R
2021/04/02(金) 13:54:33.57ID:6+Rf0OKV
einsumとか添字の入れ替えくらいの本当に基本的な機能だけ持ってる多次元配列クラスがほしいんだけど、なんでこれしきのものがboostにはないの?
2021/04/02(金) 14:03:29.72ID:q3Egk2LJ
君の実装を世界が待ってるんだぞ
文句言う前に公開せよ
文句言う前に公開せよ
2021/04/02(金) 14:19:38.24ID:6+Rf0OKV
>>70
今は自分で実装して騙し騙し使ってるけど、こういうファンダメンタルかつパフォーマンスが必要なものは誰か信用できるプロバイダに作ってほしい
今は自分で実装して騙し騙し使ってるけど、こういうファンダメンタルかつパフォーマンスが必要なものは誰か信用できるプロバイダに作ってほしい
2021/04/02(金) 17:28:33.51ID:65VwiNme
実用的な必要に迫られている人こそ
変な妥協もお花畑なオーバースペックもない
機能美なコードを書けるんだけどな
変な妥協もお花畑なオーバースペックもない
機能美なコードを書けるんだけどな
2021/04/02(金) 19:20:37.25ID:OIYek4iX
>>72
実用的なコードというのは進化し続けるコードであって、常に古びた無駄を抱えているもんだ。
実用的なコードというのは進化し続けるコードであって、常に古びた無駄を抱えているもんだ。
2021/04/03(土) 03:21:26.87ID:YT89Uc9u
仕様変更できなくなって陳腐化していくことはあるな
2021/04/03(土) 06:35:59.59ID:FsaMqi3u
std::vector<bool>のpopcountを簡単にとる方法をおしえてくだちい
以下のようにして自力で数えるしかない?
size_t popcount(const std::vector<bool>& vec) {
size_t cnt = (size_t)0;
for (auto it = vec.begin(); it != vec.end(); it++) {
if ((bool)(*it)) {
cnt++;
}
}
return cnt;
}
あとstd::vector<bool>::size()は総ビット数を返すみたいなんですが
では実際に占有しているヒープのサイズは
どうやって確かめたら良いんでしたっけ……_○/|_
以下のようにして自力で数えるしかない?
size_t popcount(const std::vector<bool>& vec) {
size_t cnt = (size_t)0;
for (auto it = vec.begin(); it != vec.end(); it++) {
if ((bool)(*it)) {
cnt++;
}
}
return cnt;
}
あとstd::vector<bool>::size()は総ビット数を返すみたいなんですが
では実際に占有しているヒープのサイズは
どうやって確かめたら良いんでしたっけ……_○/|_
2021/04/03(土) 07:04:05.36ID:FsaMqi3u
つかstd::count(vec.begin(), vec.end(), true)で一応動くみたいけど
中でbool型の等値判定していると思うんですが問題無いんでしたっけ……
中でbool型の等値判定していると思うんですが問題無いんでしたっけ……
2021/04/03(土) 07:45:13.57ID:lohjPiFl
不安だったらvector<bool>なんか使うな
それは素人が手を出していいものじゃない
それは素人が手を出していいものじゃない
2021/04/03(土) 09:24:55.78ID:FsaMqi3u
集合表現のためのビットマップのロジックを新たに新規に作るよりマシ、
という天才の判断
という天才の判断
2021/04/03(土) 12:58:35.52ID:cvW9PgHj
std::bitsetじゃいかんのか?
2021/04/03(土) 13:23:18.30ID:FsaMqi3u
天才か!
しかしstd::bitsetは要素数が整数の基本型のビット数を超えられないのでは……
しかしstd::bitsetは要素数が整数の基本型のビット数を超えられないのでは……
2021/04/03(土) 13:33:00.76ID:3ynmntXR
要素数が本当に動的に変わるの?
2021/04/03(土) 13:49:31.61ID:5dv7xI+Y
2^32以上のサイズが必要だってこと?
何に使うの?
何に使うの?
2021/04/03(土) 13:51:40.21ID:FsaMqi3u
2021/04/03(土) 13:52:40.69ID:rmK5g90q
int128の整数を使えば
2021/04/03(土) 13:52:47.30ID:FsaMqi3u
訂正orz
誤: 当然32個以上の要素からなる集合
正: 当然64個を超える要素からなる集合
誤: 当然32個以上の要素からなる集合
正: 当然64個を超える要素からなる集合
2021/04/03(土) 14:04:02.94ID:5dv7xI+Y
>>80
え?普通に32超えられるけど
え?普通に32超えられるけど
2021/04/03(土) 15:15:47.45ID:62Tyvx2d
何かこういう訳のわからない事を書き込んでまで質問するならもっとわかりやすく書けよと思う
そもそも動的じゃないなら配列でええやろ
そもそも動的じゃないなら配列でええやろ
88デフォルトの名無しさん
2021/04/03(土) 17:28:40.18ID:0zCBAqiq c++関係あるかわかりませんが、テクスチャをバラバラに分割するロジックってどうやって作るんでしょうか?
例えばジグソーパズルや、このモザイク画のように、1枚の絵をバラバラにしたいのです。
ばらばらにしたものを戻すというゲームを作ろうとしています。
https://docs.gimp.org/2.8/ja/plug-in-mosaic.html
これが作成したサンプル画像です
https://i.imgur.com/abyDlBI.png
グリッドの線がうっすら見えると思いますが、これを2次元配列とみなします。
適当に四角形を選択して、大まかな位置を決めます。
しかし、その後、四角形を三角形や五角形にするにはどうしたらいいのでしょうか?
隣り合う頂点をマージするなどすればできそうですが。
つまり、頂点という概念を使わないとこの機能は実現出来ないでしょうか?
板ポリゴンを2dとして映せば行けるかなと思ってます。
まあ、inkscapeなどで手作業で作れよって話ですけどね。
自動でパズル作ってくれたらいいなと思って。
エンジンはgodotです(´・ω・`)が、processingなどの環境でもいいです。
ヒントください
例えばジグソーパズルや、このモザイク画のように、1枚の絵をバラバラにしたいのです。
ばらばらにしたものを戻すというゲームを作ろうとしています。
https://docs.gimp.org/2.8/ja/plug-in-mosaic.html
これが作成したサンプル画像です
https://i.imgur.com/abyDlBI.png
グリッドの線がうっすら見えると思いますが、これを2次元配列とみなします。
適当に四角形を選択して、大まかな位置を決めます。
しかし、その後、四角形を三角形や五角形にするにはどうしたらいいのでしょうか?
隣り合う頂点をマージするなどすればできそうですが。
つまり、頂点という概念を使わないとこの機能は実現出来ないでしょうか?
板ポリゴンを2dとして映せば行けるかなと思ってます。
まあ、inkscapeなどで手作業で作れよって話ですけどね。
自動でパズル作ってくれたらいいなと思って。
エンジンはgodotです(´・ω・`)が、processingなどの環境でもいいです。
ヒントください
2021/04/03(土) 17:42:25.44ID:5dv7xI+Y
1ドットずつ走査して近似色以外は透明色で塗りつぶせば
2021/04/03(土) 17:43:36.15ID:Hj8nCIUt
>>88
こういう話? C++ は関係なさそう。
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%AD%E3%83%8E%E3%82%A4%E5%9B%B3
gimp のプラグインになってるんならソースありそうだからそれ見ればいいんじゃねとも思う。
こういう話? C++ は関係なさそう。
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%AD%E3%83%8E%E3%82%A4%E5%9B%B3
gimp のプラグインになってるんならソースありそうだからそれ見ればいいんじゃねとも思う。
2021/04/03(土) 18:06:49.53ID:XWE78oAN
OpenGLとかグラフィックプログラミング系のスレで聞くべき・・といいたいところだが
この板は上から下まで、やれこっちが優れてるだのこのやりかたは汚いだの
アホみたいなマナー・作法論しか議論していない板なのでたぶん書籍かWebを検索したほうがいい
この板は上から下まで、やれこっちが優れてるだのこのやりかたは汚いだの
アホみたいなマナー・作法論しか議論していない板なのでたぶん書籍かWebを検索したほうがいい
2021/04/03(土) 18:11:14.04ID:FsaMqi3u
適当に点{ p1, p2, p3, ... } をばらまいてボロノイ境界を描いたら
ボロノイ境界が勝手に種々の多角形になりまくり……!
あとは1つの区画内を点{ p1, p2, p3, ... }における画像の色とかの
適当な色で塗り潰せば良い
言うは安し……!!
ボロノイ境界が勝手に種々の多角形になりまくり……!
あとは1つの区画内を点{ p1, p2, p3, ... }における画像の色とかの
適当な色で塗り潰せば良い
言うは安し……!!
2021/04/03(土) 22:25:01.27ID:M/dPb3y2
とりあえず2Dゲーをいちいちポリゴンでやるのはやめといた方がいいかも・・
テクスチャの内容を一枚のビットマップとしていじった方が楽な気がする
スワイプやドラッグでピースを動かすときは板ポリ使ってもいいかもしれんけど
テクスチャの内容を一枚のビットマップとしていじった方が楽な気がする
スワイプやドラッグでピースを動かすときは板ポリ使ってもいいかもしれんけど
94デフォルトの名無しさん
2021/04/04(日) 10:32:13.85ID:b5JcZ1t595デフォルトの名無しさん
2021/04/04(日) 10:37:45.94ID:b5JcZ1t5 >>93
ビットマップでやるってのは、マスでなんとかするってことですか?
ビットマップでやるってのは、マスでなんとかするってことですか?
2021/04/04(日) 10:58:31.72ID:xtAOreBW
領域を分割する頂点と辺を決めたらあとは各ピクセルごとにどの領域に含まれるかを判断すればいいように思うが
2021/04/04(日) 13:16:57.18ID:Qg2Ccl1w
>>88のサンプル画像からすると、分割された領域の頂点は格子点上にないといけないっぽい
ボロノイ境界の交点は都合良く格子点上に来るとは限らないから、ボロノイ「領域」
の作図式にやるのはいろいろな点でイマイチ感が、
ボロノイ境界の交点は都合良く格子点上に来るとは限らないから、ボロノイ「領域」
の作図式にやるのはいろいろな点でイマイチ感が、
2021/04/04(日) 13:46:45.93ID:Qg2Ccl1w
ちゅか要件定義的に(三角形は良いとして)
(1) 四角形や五角形への分割において凹図形を許容するのか否か
(2) ある図形の1つの辺を2つ以上の隣接図形で共有することを許容するのか否か
とか決めねばならない
いや決めたからといって別に頂点決定アルゴリズムの妙案とか無いが_○/|_
(1) 四角形や五角形への分割において凹図形を許容するのか否か
(2) ある図形の1つの辺を2つ以上の隣接図形で共有することを許容するのか否か
とか決めねばならない
いや決めたからといって別に頂点決定アルゴリズムの妙案とか無いが_○/|_
99デフォルトの名無しさん
2021/04/04(日) 18:57:03.43ID:b5JcZ1t5 ここは飛ばしてゲーム作ります(´・ω・`)、、、別に面白さと関係ないしね、、、。
100デフォルトの名無しさん
2021/04/04(日) 19:04:13.20ID:b5JcZ1t5 processingで似たような事できますか?ちょこちょこ練習しようかな
ゲームエンジン使うほどでもないので
https://processing.org/download/support.html
これダウンロードできます?寄付しろと言われるんですけども
ゲームエンジン使うほどでもないので
https://processing.org/download/support.html
これダウンロードできます?寄付しろと言われるんですけども
101デフォルトの名無しさん
2021/04/04(日) 19:10:44.91ID:b5JcZ1t5 できた すみあmせん
102デフォルトの名無しさん
2021/04/05(月) 08:59:16.68ID:8ugS0e8D c++言語をググるとビャーネも必ず出てきて
彼が設計者だとのことですが、コンパイラを作ってるのは彼ではないですよね
具体的に彼は何をしたの?
彼が設計者だとのことですが、コンパイラを作ってるのは彼ではないですよね
具体的に彼は何をしたの?
103デフォルトの名無しさん
2021/04/05(月) 09:24:06.09ID:YIdyLrea 言語仕様の策定だろ
まあ最初のコンパイラー(コンバーターかも)ぐらいは作ってるとは思うけど
まあ最初のコンパイラー(コンバーターかも)ぐらいは作ってるとは思うけど
104デフォルトの名無しさん
2021/04/05(月) 09:27:14.80ID:cScuzdm0 当初はCのプリプロセッサだから今で言うとTypescriptみたいなものだな
105デフォルトの名無しさん
2021/04/05(月) 11:51:16.82ID:zIvWtxBS C++標準化委員会は誰が組織したんや?
106デフォルトの名無しさん
2021/04/05(月) 11:53:41.43ID:zIvWtxBS それとも国際標準化機構(ISO)か何かの配下なの?
107デフォルトの名無しさん
2021/04/05(月) 12:36:06.42ID:ESZTLEZZ108デフォルトの名無しさん
2021/04/05(月) 17:28:39.12ID:2Tvboykg そして世界は闇と混沌に包まれた……
109デフォルトの名無しさん
2021/04/05(月) 19:55:46.69ID:rNcivJgw c++はクソだが、プログラマが求めたクソなのだ。
110デフォルトの名無しさん
2021/04/05(月) 22:13:27.34ID:zIvWtxBS111デフォルトの名無しさん
2021/04/05(月) 22:24:25.87ID:vDuR7coO ビヨーン先生の功績は
ハゲても立派なプログラマになれるという勇気をくれたことだろう
ハゲても立派なプログラマになれるという勇気をくれたことだろう
112デフォルトの名無しさん
2021/04/06(火) 06:59:06.97ID:rUOwZVXJ 質問ですが
std::vector<SomeBigObject> arr;
std::vector<int> indices;
というデータがあり、
SomeBigObjectは大小比較可能だがarr自体は未ソートで、
for (int i = 0; i < N; i++) { indices[i] = i; }
auto cmpFunc = [](int a, int b)->bool{ return (arr[a] < arr[b]); }
std::sort(indices.begin(), indices.end(), cmpFunc);
としてindices上で間接的にソートされているとき、
指定されたSomeBigObject x以上の値が現れるarr[i]の最小のiを高速に取得するには
どうづればSTLでやるには良いですのん?
std::vector<SomeBigObject> arr;
std::vector<int> indices;
というデータがあり、
SomeBigObjectは大小比較可能だがarr自体は未ソートで、
for (int i = 0; i < N; i++) { indices[i] = i; }
auto cmpFunc = [](int a, int b)->bool{ return (arr[a] < arr[b]); }
std::sort(indices.begin(), indices.end(), cmpFunc);
としてindices上で間接的にソートされているとき、
指定されたSomeBigObject x以上の値が現れるarr[i]の最小のiを高速に取得するには
どうづればSTLでやるには良いですのん?
113デフォルトの名無しさん
2021/04/06(火) 06:59:22.44ID:rUOwZVXJ arrがソートされていれば
auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
std::lower_bound(arr.begin(), arr.end(), cmpFunc2);
で済む話なんだども、SomeBigObjectはコピーの手間がかかるので直接std::sortしたくないという、
auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
std::lower_bound(arr.begin(), arr.end(), cmpFunc2);
で済む話なんだども、SomeBigObjectはコピーの手間がかかるので直接std::sortしたくないという、
114デフォルトの名無しさん
2021/04/06(火) 07:00:25.45ID:rUOwZVXJ また手動で組めということなら明らかに組める
int custom_lower_bound(int bgn, int end, const int N, const SomeBigObject& x) {
while (bgn < end) {
int mid = bgn + (end - bgn) / 2;
if (arr[mid] < x) {
bgn = mid;
} else if (x < arr[mid]) {
end = mid;
} else {
while (mid > 0 && arr[mid - 1] == x) { mid--; }
return mid;
}
}
while (bgn < N && arr[bgn] < x) {
bgn++;
}
return bgn;
}
みたいなことをしたら多分逝けるが、しかしこんなもん使う都度書きたくないし、
ライブラリとして展開して責任負いたくもないんじゃー
STLはこういうケースのためにあり、論理的に実現できる以上やり方が考えられていないとおかしいはず……
int custom_lower_bound(int bgn, int end, const int N, const SomeBigObject& x) {
while (bgn < end) {
int mid = bgn + (end - bgn) / 2;
if (arr[mid] < x) {
bgn = mid;
} else if (x < arr[mid]) {
end = mid;
} else {
while (mid > 0 && arr[mid - 1] == x) { mid--; }
return mid;
}
}
while (bgn < N && arr[bgn] < x) {
bgn++;
}
return bgn;
}
みたいなことをしたら多分逝けるが、しかしこんなもん使う都度書きたくないし、
ライブラリとして展開して責任負いたくもないんじゃー
STLはこういうケースのためにあり、論理的に実現できる以上やり方が考えられていないとおかしいはず……
115デフォルトの名無しさん
2021/04/06(火) 07:42:07.19ID:w+lldWjr auto cmpFunc3 = [](int a, int b)->bool{ return (arr[a] < arr[b]); }
i = std::lower_bound(indices.begin(), indices.end(), cmpFunc3);
arr[i];
じゃいかんのかしら
i = std::lower_bound(indices.begin(), indices.end(), cmpFunc3);
arr[i];
じゃいかんのかしら
116デフォルトの名無しさん
2021/04/06(火) 15:08:28.23ID:rUOwZVXJ >>115
lower_bound()の第3引数に検索キーxを指定する必要があるから
>>115では解決しないっていうかビルドエラーなヨカン、
ここで気づいたが>>113のlower_bound()の例は間違ってたわスマン、orz
↓これに訂正
auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
std::lower_bound(arr.begin(), arr.end(), x, cmpFunc2); // 3番目の引数は検索キーx
ところがソートされているindices上の検索キーは、検索したい実際のオブジェクトxから
ただちには求められない(普通にやったら線形探索の手間がかかる、。n_
lower_bound()の第3引数に検索キーxを指定する必要があるから
>>115では解決しないっていうかビルドエラーなヨカン、
ここで気づいたが>>113のlower_bound()の例は間違ってたわスマン、orz
↓これに訂正
auto cmpFunc2 = [](const SomeBigObject& a, const SomeBigObject &b)->bool{ return (a < b); }
std::lower_bound(arr.begin(), arr.end(), x, cmpFunc2); // 3番目の引数は検索キーx
ところがソートされているindices上の検索キーは、検索したい実際のオブジェクトxから
ただちには求められない(普通にやったら線形探索の手間がかかる、。n_
117デフォルトの名無しさん
2021/04/06(火) 17:08:29.35ID:mAZMW+WU auto cmpFunc3 = [&](int idx, const SomeBigObject& xx)->bool{ return arr[idx] < xx; }
auto i = std::lower_bound(indices.begin(), indices.end(), x, cmpFunc3);
arr[*i];
じゃあこれで
auto i = std::lower_bound(indices.begin(), indices.end(), x, cmpFunc3);
arr[*i];
じゃあこれで
118デフォルトの名無しさん
2021/04/06(火) 18:31:21.10ID:rUOwZVXJ >>117
ムリス、
つか次のように死ぬほど腐った書き方をしたらとりあえずできるた、
/// 間接ソート版lower_bound
int custom_lower_bound(const std::vector<SomeBigObj>& arr, std::vector<int>& indices, const SomeBigObj& x)
{
// SomeBigObjの間接ソート用比較関数
// xのコピーを避けるため[&](a, b)とする。
auto cmpFunc = [&](const int a, const int b)->bool {
// 有り得ないindex値が渡ってきたらxとみなす。
const SomeBigObj& obj1 = (a < 0) ? x : arr[a];
const SomeBigObj& obj2 = (b < 0) ? x : arr[b];
return (obj1 < obj2);
};
// lower_bound()の第3引数(検索キー)を有り得ないindex値にしておく。
auto found_it = std::lower_bound(indices.begin(), indices.end(), -1, cmpFunc);
// Indexに変換
return (int)std::distance(indices.begin(), found_it);
}
動作するサンプル例:
https://ideone.com/xbSHmi
ムリス、
つか次のように死ぬほど腐った書き方をしたらとりあえずできるた、
/// 間接ソート版lower_bound
int custom_lower_bound(const std::vector<SomeBigObj>& arr, std::vector<int>& indices, const SomeBigObj& x)
{
// SomeBigObjの間接ソート用比較関数
// xのコピーを避けるため[&](a, b)とする。
auto cmpFunc = [&](const int a, const int b)->bool {
// 有り得ないindex値が渡ってきたらxとみなす。
const SomeBigObj& obj1 = (a < 0) ? x : arr[a];
const SomeBigObj& obj2 = (b < 0) ? x : arr[b];
return (obj1 < obj2);
};
// lower_bound()の第3引数(検索キー)を有り得ないindex値にしておく。
auto found_it = std::lower_bound(indices.begin(), indices.end(), -1, cmpFunc);
// Indexに変換
return (int)std::distance(indices.begin(), found_it);
}
動作するサンプル例:
https://ideone.com/xbSHmi
119デフォルトの名無しさん
2021/04/07(水) 00:39:13.23ID:C05ugDVV const int lb = std::distance(indices.begin(),std::partition_point(indices.begin(), indices.end(), [&x,&arr](const int i){ return arr[i] < x; }));
これでどうかな?
これでどうかな?
120デフォルトの名無しさん
2021/04/07(水) 01:13:46.41ID:B+YGKOyD >>115
エピさんかしらん
エピさんかしらん
121デフォルトの名無しさん
2021/04/07(水) 01:17:07.25ID:KcAzRCeR122デフォルトの名無しさん
2021/04/07(水) 05:42:50.50ID:FlnHFJBF123デフォルトの名無しさん
2021/04/07(水) 06:26:08.77ID:hpqJGpH8 >>122
動かないのをおま環言うのはよく聞くがその逆を聞いたのはこれが初めてかも
動かないのをおま環言うのはよく聞くがその逆を聞いたのはこれが初めてかも
124デフォルトの名無しさん
2021/04/07(水) 07:24:58.99ID:FlnHFJBF 確かに動いているように見えるが(呼び出し回数も2分探索相当に見えるが)
Compにそんな引数渡して委員会?!
錯覚じゃないの;;;
Compにそんな引数渡して委員会?!
錯覚じゃないの;;;
125デフォルトの名無しさん
2021/04/07(水) 08:00:02.53ID:FlnHFJBF std::lower_bound(first last, value, comp);
という呼び出しにおいて、compはcomp((firstやlastと同じ型のiteratorが指す要素), value)
という呼び出され方しかされないこと、および
valueの型はfirstやlastが指す要素の型とま無関係に好きな型にして良いと規格で決まっている?!
という呼び出しにおいて、compはcomp((firstやlastと同じ型のiteratorが指す要素), value)
という呼び出され方しかされないこと、および
valueの型はfirstやlastが指す要素の型とま無関係に好きな型にして良いと規格で決まっている?!
126デフォルトの名無しさん
2021/04/07(水) 09:20:20.01ID:F9L3hm15 チラッと規格見た限り
value は first、last と無関係でいいし
comp の第一引数はfirst、lastのiteratorが指す型で、第二引数はvalueの型に決まっているように見える
value は first、last と無関係でいいし
comp の第一引数はfirst、lastのiteratorが指す型で、第二引数はvalueの型に決まっているように見える
127デフォルトの名無しさん
2021/04/07(水) 12:44:59.78ID:94shRdbf >>51じゃないが、オブジェクト指向で設計する意味が分からなくなった
汎用性の高いフリー関数が沢山あればそれで良いじゃん
汎用性の高いフリー関数が沢山あればそれで良いじゃん
128デフォルトの名無しさん
2021/04/07(水) 15:37:37.40ID:2guWvkPP129デフォルトの名無しさん
2021/04/07(水) 15:42:26.98ID:2guWvkPP ・・・いや、 lower_bound() 限定なら引数の順番もその想定でいいのか。
upper_bound() だと comp(value, x) になったりするから、交換可能にしとくのがいいけど、
片方だけ使うなら交換可能にする必要はない、と。
upper_bound() だと comp(value, x) になったりするから、交換可能にしとくのがいいけど、
片方だけ使うなら交換可能にする必要はない、と。
130デフォルトの名無しさん
2021/04/07(水) 15:44:08.41ID:2guWvkPP131デフォルトの名無しさん
2021/04/07(水) 15:45:24.56ID:x8RK+cZQ >>128
requiresのとこは見た?
requiresのとこは見た?
132デフォルトの名無しさん
2021/04/07(水) 17:04:44.94ID:x8RK+cZQ133デフォルトの名無しさん
2021/04/08(木) 06:24:25.70ID:ByNsu0yr134デフォルトの名無しさん
2021/04/08(木) 10:00:06.97ID:b/WIqkut >>132
あ、ごめん。比較関数の引数順を交換可能にするのは lower_bound, upper_bound 両用にすることを想定しての話。
あ、ごめん。比較関数の引数順を交換可能にするのは lower_bound, upper_bound 両用にすることを想定しての話。
135デフォルトの名無しさん
2021/04/08(木) 16:09:17.02ID:uZSkMyuO 生魚にあたって、
入院した病院の天井みながらSTL考えてたもんな
入院した病院の天井みながらSTL考えてたもんな
136デフォルトの名無しさん
2021/04/08(木) 16:25:55.36ID:/Z+9yHN3 ステパノフ?
137デフォルトの名無しさん
2021/04/08(木) 23:02:01.67ID:6aXKgzGP ニダーランが終了になるそうだ
もう糞スレは立てにくくなるな
ざまあ
もう糞スレは立てにくくなるな
ざまあ
138デフォルトの名無しさん
2021/04/09(金) 01:15:08.43ID:iqXbiQSS139デフォルトの名無しさん
2021/04/09(金) 11:44:34.26ID:B1MFSAev C++11でのstd::swapは、次のようなコードになっているそうですが、
仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
仮にt1のポインタ的なメンバにnullptr的なものが代入されない場合、
(2)でt1への代入に置いて何が起きるのか心配です。
質問の仕方を変えるならば、
share_ptrは参照カウンタ方式ですのでカウンタのアップ/ダウンは正確でなければ
なりませんが、以下の例では、いったいどの行のどの演算子(またはどの部分)で
カウントアップ/カウントダウンされるんでしょうか。
template<typename T> void swap(T& t1, T& t2) {
T temp = std::move(t1); // (1), or T temp(std::move(t1));
t1 = std::move(t2); // (2)
t2 = std::move(temp); // (3)
}
仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
仮にt1のポインタ的なメンバにnullptr的なものが代入されない場合、
(2)でt1への代入に置いて何が起きるのか心配です。
質問の仕方を変えるならば、
share_ptrは参照カウンタ方式ですのでカウンタのアップ/ダウンは正確でなければ
なりませんが、以下の例では、いったいどの行のどの演算子(またはどの部分)で
カウントアップ/カウントダウンされるんでしょうか。
template<typename T> void swap(T& t1, T& t2) {
T temp = std::move(t1); // (1), or T temp(std::move(t1));
t1 = std::move(t2); // (2)
t2 = std::move(temp); // (3)
}
140デフォルトの名無しさん
2021/04/09(金) 11:45:42.89ID:B1MFSAev >>139
誤:仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
正:(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
誤:仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
正:(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
141デフォルトの名無しさん
2021/04/09(金) 11:58:14.49ID:O38yN+C3 >>138
C++03にもstd::binary_searchあるぞ
C++03にもstd::binary_searchあるぞ
142はちみつ餃子 ◆8X2XSCHEME
2021/04/09(金) 12:00:21.75ID:foJJo5gI >>139
> nullptr的なものが代入されるんでしょうか。
この場合はされる。
ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
> いったいどの行のどの演算子(またはどの部分)で
> カウントアップ/カウントダウンされるんでしょうか。
= がその役割を持っている。
ムーブコンストラクタとムーブ代入演算子によってカウントされる。
> nullptr的なものが代入されるんでしょうか。
この場合はされる。
ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
> いったいどの行のどの演算子(またはどの部分)で
> カウントアップ/カウントダウンされるんでしょうか。
= がその役割を持っている。
ムーブコンストラクタとムーブ代入演算子によってカウントされる。
143デフォルトの名無しさん
2021/04/09(金) 12:02:12.29ID:B1MFSAev >>140
どうやら、
(1) の中央の = では、TからTへの move-constructorが呼び出され、
(2)や(3) の中央の = では、TからTへの move-assignment operatorが呼び出される、
ということのようですが、
Tのmove-contructorやmove-assingment operatorは、ユーザーの実装次第で、
ユーザーがそれらを明示的に書かなかった場合の「デフォルトの定義」は
現在もまだ論争中で、標準的な仕様が決まってない、ということらしいですね。
間違っていれば指摘してください。
どうやら、
(1) の中央の = では、TからTへの move-constructorが呼び出され、
(2)や(3) の中央の = では、TからTへの move-assignment operatorが呼び出される、
ということのようですが、
Tのmove-contructorやmove-assingment operatorは、ユーザーの実装次第で、
ユーザーがそれらを明示的に書かなかった場合の「デフォルトの定義」は
現在もまだ論争中で、標準的な仕様が決まってない、ということらしいですね。
間違っていれば指摘してください。
144デフォルトの名無しさん
2021/04/09(金) 12:11:46.34ID:fGHst4+7145デフォルトの名無しさん
2021/04/09(金) 12:20:57.67ID:QYkH8yRN >>143
以下のサイトによれば、「標準的な仕様は決まっている」ようです:
drafet C++11 standareのsection 12.8のparagraph 15に
implicitly-defined copy/move constructor は、
「a memberwise copy/move of its bases and members」
であると書いてあるそうですから:
https://stackoverflow.com/questions/18290523/is-a-default-move-constructor-equivalent-to-a-member-wise-move-constructor
The implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members. [ Note: brace-or-equal-initializers of non-static data members are ignored. See also the example in 12.6.2. —end note ] The order of initialization is the same as the order of initialization of bases and members in a user-defined constructor (see 12.6.2). Let x be either the parameter of the constructor or, for the move constructor, an xvalue referring to the parameter. Each base or non-static data member is copied/moved in the manner appropriate to its type:
if the member is an array, each element is direct-initialized with the corresponding subobject of x;
if a member m has rvalue reference type T&&, it is direct-initialized with static_cast(x.m);
otherwise, the base or member is direct-initialized with the corresponding base or member of x.
Virtual base class subobjects shall be initialized only once by the implicitly-defined copy/move constructor (see 12.6.2).
以下のサイトによれば、「標準的な仕様は決まっている」ようです:
drafet C++11 standareのsection 12.8のparagraph 15に
implicitly-defined copy/move constructor は、
「a memberwise copy/move of its bases and members」
であると書いてあるそうですから:
https://stackoverflow.com/questions/18290523/is-a-default-move-constructor-equivalent-to-a-member-wise-move-constructor
The implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members. [ Note: brace-or-equal-initializers of non-static data members are ignored. See also the example in 12.6.2. —end note ] The order of initialization is the same as the order of initialization of bases and members in a user-defined constructor (see 12.6.2). Let x be either the parameter of the constructor or, for the move constructor, an xvalue referring to the parameter. Each base or non-static data member is copied/moved in the manner appropriate to its type:
if the member is an array, each element is direct-initialized with the corresponding subobject of x;
if a member m has rvalue reference type T&&, it is direct-initialized with static_cast(x.m);
otherwise, the base or member is direct-initialized with the corresponding base or member of x.
Virtual base class subobjects shall be initialized only once by the implicitly-defined copy/move constructor (see 12.6.2).
146デフォルトの名無しさん
2021/04/09(金) 12:39:59.46ID:QYkH8yRN >>142
>ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
>標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
>メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
なるほど。
行(1)の場合、
1. 右辺でstd::move()をt1に行った段階では(実行段階で)マシン語は全く実行されない。
2. 中央の = は、move-constructor と解釈され、Tのmove-constructorが呼び出される。
3. Tの暗黙定義のmove-constructorは、メンバ同士のmove-construcotrなので、
メンバに shared_ptr<A> a があると、shared_ptr<A>のmoveコンストラクタが呼び出される。
そして、shared_ptr<A>のmoveコンストラクタは、実行後に「src側(from側)」をnullptr相当の
状態にしてしまう。
ということのようですね。
>ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
>標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
>メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
なるほど。
行(1)の場合、
1. 右辺でstd::move()をt1に行った段階では(実行段階で)マシン語は全く実行されない。
2. 中央の = は、move-constructor と解釈され、Tのmove-constructorが呼び出される。
3. Tの暗黙定義のmove-constructorは、メンバ同士のmove-construcotrなので、
メンバに shared_ptr<A> a があると、shared_ptr<A>のmoveコンストラクタが呼び出される。
そして、shared_ptr<A>のmoveコンストラクタは、実行後に「src側(from側)」をnullptr相当の
状態にしてしまう。
ということのようですね。
147デフォルトの名無しさん
2021/04/09(金) 12:42:08.46ID:QYkH8yRN >>146
逆に言えば、Tのメンバに、A *pA; のような生ポインタがあると、
Tの暗黙のmoveコンストラクタ/move代入演算子では、恐らく、
「src側(from側)」にはnullptrが代入されない(??)ので、非常に困った
問題を招くかも知れないと?
逆に言えば、Tのメンバに、A *pA; のような生ポインタがあると、
Tの暗黙のmoveコンストラクタ/move代入演算子では、恐らく、
「src側(from側)」にはnullptrが代入されない(??)ので、非常に困った
問題を招くかも知れないと?
148デフォルトの名無しさん
2021/04/09(金) 12:44:10.41ID:QYkH8yRN149デフォルトの名無しさん
2021/04/09(金) 12:45:44.21ID:iOouO9yu 生ポ入りクラスに暗黙move関数定義できたっけ?
150デフォルトの名無しさん
2021/04/09(金) 18:46:49.83ID:WYvZUx+H c++についてうんちく垂れるやつに限って仕事ができない
そんなうんちくどうでもいいから、さっさと作れよって思われてる先輩いるわ
そんなうんちくどうでもいいから、さっさと作れよって思われてる先輩いるわ
151デフォルトの名無しさん
2021/04/09(金) 19:06:14.56ID:PF0aPDJN >>150
プログラマは怠惰であれ、を地で行ってるんだろう
プログラマは怠惰であれ、を地で行ってるんだろう
152デフォルトの名無しさん
2021/04/09(金) 19:55:10.43ID:O38yN+C3 >>144
> わざわざ誰が書いたかわからないようなものより自作できるなら自作するだろ
おまえは一生二度とライブラリもOSも使うな
ベアメタルだけで食っていけ
それができたら、おまえに付いてくる者たちが顕れるだろう
できなければ人知れず消えるだけだ
どうなりたいかは、お前の人生だ
俺がどうしろとは言えない
> わざわざ誰が書いたかわからないようなものより自作できるなら自作するだろ
おまえは一生二度とライブラリもOSも使うな
ベアメタルだけで食っていけ
それができたら、おまえに付いてくる者たちが顕れるだろう
できなければ人知れず消えるだけだ
どうなりたいかは、お前の人生だ
俺がどうしろとは言えない
153デフォルトの名無しさん
2021/04/09(金) 20:38:18.09ID:8YMfBGcF >>150
またお前か。さっさとプログラミング覚えろよ
またお前か。さっさとプログラミング覚えろよ
154デフォルトの名無しさん
2021/04/09(金) 23:03:48.36ID:mQjFjskh std::binary_search()は戻り値とかなんとboolや
こんなのよかちゃんと位置を返してくれるstd::lower_bound()の方がよっぽど使いでがある
ちなstd::lower_bound()が2分探索か線形探索かは使うイテレータの条件次第
こんなのよかちゃんと位置を返してくれるstd::lower_bound()の方がよっぽど使いでがある
ちなstd::lower_bound()が2分探索か線形探索かは使うイテレータの条件次第
155デフォルトの名無しさん
2021/04/09(金) 23:08:01.53ID:mQjFjskh std::lower_bound()が線形探索だと断言してくださる香ばしいblogも世の中にはあるが
https://rsk0315.hatenablog.com/entry/2019/09/10/173708
これがまつがいであることは比較関数の中でprintf()でもしたらたちどころにワカル
https://rsk0315.hatenablog.com/entry/2019/09/10/173708
これがまつがいであることは比較関数の中でprintf()でもしたらたちどころにワカル
156デフォルトの名無しさん
2021/04/09(金) 23:29:26.43ID:mQjFjskh ゴメソリンク先は必ずしも断言はしていなくって、std::set<T>にstd::lower_bound()を適用する例か、
これのイテレータはrandom-access iteratorでないから確かに線形探索になる
これのイテレータはrandom-access iteratorでないから確かに線形探索になる
157デフォルトの名無しさん
2021/04/10(土) 02:28:09.12ID:+Yr/nSyJ158デフォルトの名無しさん
2021/04/10(土) 13:02:03.74ID:62UJIlpX159デフォルトの名無しさん
2021/04/10(土) 13:04:24.60ID:ziRUnSTY160デフォルトの名無しさん
2021/04/11(日) 21:20:47.36ID:aRgjPq06 コンパイラはともかくリンカに計算負担をかけるのはバカな設計だなと思うわ。
161デフォルトの名無しさん
2021/04/11(日) 21:31:53.64ID:X3ahc6YE >>160 何の設計の話?
162デフォルトの名無しさん
2021/04/11(日) 22:03:18.21ID:oDlLzjRc 暗黙のmoveがnullptr代入してくれないとか生ポあるクラスに暗黙のctor定義してくれるのか、とか
学ぶ順番間違えて勘違いしてるやつ上の方にいるけど
そもそも生ポの扱いに言語が介入するんならdtorでdeleteしてくれるのか、とか考えつかないのかね・・
学ぶ順番間違えて勘違いしてるやつ上の方にいるけど
そもそも生ポの扱いに言語が介入するんならdtorでdeleteしてくれるのか、とか考えつかないのかね・・
163デフォルトの名無しさん
2021/04/11(日) 22:28:21.28ID:AbYQFAoI 質問者はポインタ型とshared_ptrについて聞いてたのに、shared_ptrのことしか答えなかった餃子が悪い。
謝れ!俺に
謝れ!俺に
164デフォルトの名無しさん
2021/04/12(月) 13:47:17.66ID:SAslKmLH 指定ソフトのFWを許可するAPI教えてくださいよ
165はちみつ餃子 ◆8X2XSCHEME
2021/04/12(月) 15:59:50.47ID:8pnQviW4 そうか。
166デフォルトの名無しさん
2021/04/12(月) 18:14:36.03ID:jbHGiSQO 皆さま御機嫌よう、ちょっと質問させてください
class hogeの内部でenum class fugaを定義し、
そのfugaをclass hogehoge でメンバ変数として使用したいのですが、
hogehoge のヘッダーにはなるべくhoge をインクルードさせたくありません。
もちろんfuga変数はヘッダーに置いて使用したいのですが……
前方宣言でfugaを宣言してもhoge::fugaと互換?が無いため代入が出来ません。
キャストで戻したりして使っているのですがこれならintでもいいかなと……
クラス内クラスの前方宣言は難しいのでしょうか?
何か方法がありましたら教えていただきたく……
class hoge{
enum class fuga{
one,two,three,SUM
};
};
//ヘッダーはソースにインクルードしたい
class hogehoge{
hoge::fuga mfuga;
};
こんかかんじで使いたいのですがエラーになってしまいsまずorz
class hogeの内部でenum class fugaを定義し、
そのfugaをclass hogehoge でメンバ変数として使用したいのですが、
hogehoge のヘッダーにはなるべくhoge をインクルードさせたくありません。
もちろんfuga変数はヘッダーに置いて使用したいのですが……
前方宣言でfugaを宣言してもhoge::fugaと互換?が無いため代入が出来ません。
キャストで戻したりして使っているのですがこれならintでもいいかなと……
クラス内クラスの前方宣言は難しいのでしょうか?
何か方法がありましたら教えていただきたく……
class hoge{
enum class fuga{
one,two,three,SUM
};
};
//ヘッダーはソースにインクルードしたい
class hogehoge{
hoge::fuga mfuga;
};
こんかかんじで使いたいのですがエラーになってしまいsまずorz
167デフォルトの名無しさん
2021/04/12(月) 18:58:57.80ID:jbHGiSQO enum classはグローバルに置いた方がいいんでしょうか?
任意のクラス内部で規定したいenumが見た目も便利だと思ったのでなるべく入れ子にしたかったのですが
任意のクラス内部で規定したいenumが見た目も便利だと思ったのでなるべく入れ子にしたかったのですが
168デフォルトの名無しさん
2021/04/12(月) 19:30:43.48ID:e7ZnlCa0 >>167
hoge をインクルードしないところで hoge::fuga を使いたいということは
fuga は hoge にそれほど強く結びついていないということで、外に出すのが妥当なのでは?
外に置いたうえで hoge 内で using fuga = outer_fuga とでもすれば、見た目は損なわれないだろうし。
hoge をインクルードしないところで hoge::fuga を使いたいということは
fuga は hoge にそれほど強く結びついていないということで、外に出すのが妥当なのでは?
外に置いたうえで hoge 内で using fuga = outer_fuga とでもすれば、見た目は損なわれないだろうし。
169デフォルトの名無しさん
2021/04/12(月) 19:43:07.58ID:jbHGiSQO170デフォルトの名無しさん
2021/04/12(月) 19:43:19.37ID:jbHGiSQO ありがとうございました
171デフォルトの名無しさん
2021/04/13(火) 19:17:47.93ID:CekyfU50 std::sortがセーフソートかどうかって決まってないんですね?
172デフォルトの名無しさん
2021/04/13(火) 19:20:46.00ID:dUpGrFVX セーフソートとは何なのか、決まってないですね。
173デフォルトの名無しさん
2021/04/13(火) 19:49:36.98ID:3ATJKALM 安定ソートのことならstd::stable_sortを使え
174デフォルトの名無しさん
2021/04/13(火) 20:39:25.63ID:E/HY6RLS std::stable_sort<T>はどうしてもstd::sort<T>より遅い
からstd::stable_sort<T>で安定ソートするテクニックが存在するし需要がある
からstd::stable_sort<T>で安定ソートするテクニックが存在するし需要がある
175デフォルトの名無しさん
2021/04/13(火) 20:57:29.81ID:E/HY6RLS もちろんタダでというわけにはいかずn個のTのソーティングに対しn個の整数型の配列が別途必要だがとにかくできる
176デフォルトの名無しさん
2021/04/13(火) 20:58:57.72ID:E/HY6RLS まつがえたorz
誤: std::stable_sort<T>
正: std::sort<T>
誤: std::stable_sort<T>
正: std::sort<T>
177デフォルトの名無しさん
2021/04/13(火) 21:07:31.95ID:E/HY6RLS 計算量の仕様からすると何だかんだ言って
std::stable_sort<T>の中身はマージソートで、
std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
ぐらいしかありえない
std::stable_sort<T>の中身はマージソートで、
std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
ぐらいしかありえない
178デフォルトの名無しさん
2021/04/13(火) 21:10:52.16ID:CekyfU50 みなさんありがとうございます
安定ソートのことでした
安定ソートのことでした
179デフォルトの名無しさん
2021/04/14(水) 05:40:12.90ID:OwJGUJdo > std::stable_sort<T>の中身はマージソートで、
これはまあそんなもうだろうけど
> std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
なんでここまで限定するんだ?
これはまあそんなもうだろうけど
> std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
なんでここまで限定するんだ?
180デフォルトの名無しさん
2021/04/14(水) 06:51:50.47ID:1+2DD+HN https://cpprefjp.github.io/reference/algorithm/sort.html
>C++11以降: O(N log N) (N == last - first) 計算量での比較
>クイックソートは平均計算量がO(N Log N)だが、最悪計算量がO(n^2)である。そのため、C++03の計算量要件には合致するが、C++11の要件には合致しない
>C++11以降: O(N log N) (N == last - first) 計算量での比較
>クイックソートは平均計算量がO(N Log N)だが、最悪計算量がO(n^2)である。そのため、C++03の計算量要件には合致するが、C++11の要件には合致しない
181デフォルトの名無しさん
2021/04/14(水) 06:52:54.28ID:mDTOVFC3 ubuntuでの開発環境って何があるんでしょうか?
openglなのでc++を使うことになると思うんですが、c++はideとしてvscodeでいいですよね
guiは何が一般的なんでしょうか?
openglなのでc++を使うことになると思うんですが、c++はideとしてvscodeでいいですよね
guiは何が一般的なんでしょうか?
182デフォルトの名無しさん
2021/04/14(水) 07:20:31.68ID:OwJGUJdo > この関数には、特定のアルゴリズムで実装すべきという規定はない
183デフォルトの名無しさん
2021/04/14(水) 07:23:57.67ID:OwJGUJdo 古典的なソート議論はユニプロセッサ前提
今どきの並列化の流れに必ずしも当てはまるとは思えない
今どきの並列化の流れに必ずしも当てはまるとは思えない
184デフォルトの名無しさん
2021/04/14(水) 07:27:25.07ID:B6LD9tEC boost::sort::pdqsort(), boost::sort::block_indirect_sort() あたりならヘッダーだけで並列ソートできる
185デフォルトの名無しさん
2021/04/14(水) 09:23:48.49ID:hYFflu6b >>181
GUIなんか使わないのが一般的だよ
開発環境にわざわざC++とLinuxを選ぶような人は自分用アプリにGUIなんて組み込まないだろうし、
他人に使わせるならどうせWindowsでテストしなきゃいけないからLinuxなんて時間の無駄だ
OpenGLだったらOpenGLの描画結果を表示するウィンドウとターミナルでいい
GUIなんか使わないのが一般的だよ
開発環境にわざわざC++とLinuxを選ぶような人は自分用アプリにGUIなんて組み込まないだろうし、
他人に使わせるならどうせWindowsでテストしなきゃいけないからLinuxなんて時間の無駄だ
OpenGLだったらOpenGLの描画結果を表示するウィンドウとターミナルでいい
186デフォルトの名無しさん
2021/04/14(水) 10:52:22.55ID:OwJGUJdo 自分用アプリねえ
俺の定規ウインドウなんてGUIだけど
俺の定規ウインドウなんてGUIだけど
187デフォルトの名無しさん
2021/04/14(水) 11:09:58.93ID:lMgtIJ1Q 定規ww
188デフォルトの名無しさん
2021/04/14(水) 12:59:06.52ID:mDTOVFC3189デフォルトの名無しさん
2021/04/14(水) 16:06:34.29ID:qBzPSYhh 定規がとても気になる
190デフォルトの名無しさん
2021/04/14(水) 16:25:09.90ID:qBzPSYhh ぐぐったら沢山出てきた
頭が悪くて理解出来ないけど需要あるんだね
頭が悪くて理解出来ないけど需要あるんだね
191デフォルトの名無しさん
2021/04/14(水) 17:07:15.14ID:X49CrYgb unique_ptr<hoge> 自体が型名なんでしょうか?
class unique_ptr<hoge>で前方宣言してもいいのかな?
class unique_ptr<hoge>で前方宣言してもいいのかな?
192デフォルトの名無しさん
2021/04/14(水) 18:15:29.38ID:OwJGUJdo 明示的な具現のつもりなら構文が違うね
193デフォルトの名無しさん
2021/04/14(水) 18:22:49.87ID:X49CrYgb 素人なんで自分の説明が難あると思うんだけど自分なりに精一杯説明すると、
ヘッダー部の引数にclass unique-ptr<hoge>& uhogeを載せて、
ソース部にhoge.hをインクルードして定義する感じでつかいたんだけども……
試してみたけど動くんだけどなんか怖い
想像ではunique-ptr<class hoge>が前方宣言だと思ってたもので……
どこをどう調べればいいのかだけでも教えていただければ……
ヘッダー部の引数にclass unique-ptr<hoge>& uhogeを載せて、
ソース部にhoge.hをインクルードして定義する感じでつかいたんだけども……
試してみたけど動くんだけどなんか怖い
想像ではunique-ptr<class hoge>が前方宣言だと思ってたもので……
どこをどう調べればいいのかだけでも教えていただければ……
194はちみつ餃子 ◆8X2XSCHEME
2021/04/14(水) 18:34:21.63ID:VF/LllcQ >>191
テンプレートのインスタンス化は暗黙にやってくれるので基本的にはする必要がない。
どうしても宣言したいのなら
extern class unique_ptr<hoge>;
と書くことは可能。
ただし、このように宣言した場合には暗黙のインスタンス化は抑制されるので、
別の場所で明示的インスタンス化をしておく必要がある。
テンプレートの展開はその仕組み上、各翻訳単位ごとにやった上でリンク時に統合されるというクソみたいなことになってるので、
コンパイル時間を抑制したいなどの理由でこういった変なことになってる。
テンプレートのインスタンス化は暗黙にやってくれるので基本的にはする必要がない。
どうしても宣言したいのなら
extern class unique_ptr<hoge>;
と書くことは可能。
ただし、このように宣言した場合には暗黙のインスタンス化は抑制されるので、
別の場所で明示的インスタンス化をしておく必要がある。
テンプレートの展開はその仕組み上、各翻訳単位ごとにやった上でリンク時に統合されるというクソみたいなことになってるので、
コンパイル時間を抑制したいなどの理由でこういった変なことになってる。
195デフォルトの名無しさん
2021/04/14(水) 18:51:48.53ID:X49CrYgb ユニークポインタ自体の大きさが、ポインタだから4バイトくらいに統一されているのかな?
型テンプレートがどんな型でも、定義部分で明示してあればポインタ長のメモリをアロケートされているから、宣言自体はある程度の許容範囲があるということなのかな?
理解が違ってたらすいません
型テンプレートがどんな型でも、定義部分で明示してあればポインタ長のメモリをアロケートされているから、宣言自体はある程度の許容範囲があるということなのかな?
理解が違ってたらすいません
196デフォルトの名無しさん
2021/04/14(水) 19:01:58.75ID:IrZTmcl1197デフォルトの名無しさん
2021/04/14(水) 19:39:51.01ID:udtyfuhd 前方宣言というのはあくまで「こういう名前のこういう奴が(どっかに)いますよ」って言ってるだけ
実体がどんなサイズでどんな値やメンバやなんやかんやを持ってるかとかには関知しない
実体がどんなサイズでどんな値やメンバやなんやかんやを持ってるかとかには関知しない
198はちみつ餃子 ◆8X2XSCHEME
2021/04/14(水) 21:35:38.45ID:VF/LllcQ >>196
> 明示的インスタンス化しておけばコンパイル時間抑制できるの?
ちがうちがう。
extern のほう (宣言) が暗黙のインスタンス化を抑制するからコンパイル時間が短縮されることが期待できる。
でも、インスタンス化を抑制するんだからどこか別の翻訳単位に実体が存在する必要はあって、
それに明示的インスタンス化を使えるようになってるって話。
> 明示的インスタンス化しておけばコンパイル時間抑制できるの?
ちがうちがう。
extern のほう (宣言) が暗黙のインスタンス化を抑制するからコンパイル時間が短縮されることが期待できる。
でも、インスタンス化を抑制するんだからどこか別の翻訳単位に実体が存在する必要はあって、
それに明示的インスタンス化を使えるようになってるって話。
199デフォルトの名無しさん
2021/04/14(水) 22:23:18.21ID:IrZTmcl1 あーなるほどね、thx
200デフォルトの名無しさん
2021/04/14(水) 22:43:29.65ID:B6LD9tEC 今時コンパイル時間を稼ぐとかどうなの
201デフォルトの名無しさん
2021/04/14(水) 23:07:25.20ID:IrZTmcl1 リッチにテンプレート使いまくって一本ソフト書いてみ
まぁわかりやすいのはspiritとかのET使ったやつ、それを複数のソースファイルで使いまくればわかる
さらに言えば自分でそういうライブラリ書いて少しの変更でほぼフルビルドかかるのを体験すればわかるやろ
まぁわかりやすいのはspiritとかのET使ったやつ、それを複数のソースファイルで使いまくればわかる
さらに言えば自分でそういうライブラリ書いて少しの変更でほぼフルビルドかかるのを体験すればわかるやろ
202デフォルトの名無しさん
2021/04/15(木) 00:02:44.73ID:5MHywbxF >>200
今時コンパイル時間を気にしないほうが頭悪いわ。
今時コンパイル時間を気にしないほうが頭悪いわ。
203デフォルトの名無しさん
2021/04/15(木) 00:26:49.07ID:daBkAWQM いまいちメタプの必要性が理解できん
コンパイル時に決定してる値しか計算できないんでしょ
3の階乗は計算できるけど、ユーザーから入力された値の階乗は計算出来ないって・・・
だったらはなから6ってハードコーディングしとけ
コンパイル時に決定してる値しか計算できないんでしょ
3の階乗は計算できるけど、ユーザーから入力された値の階乗は計算出来ないって・・・
だったらはなから6ってハードコーディングしとけ
204はちみつ餃子 ◆8X2XSCHEME
2021/04/15(木) 00:38:40.10ID:FEj8Wx1j205デフォルトの名無しさん
2021/04/15(木) 00:54:46.36ID:3EsQmY5s >>203
こういう書き方出来たら便利なのにな、とかを無理矢理実現できるというロマンはある
(マクロと似たようなもんだが
プロパティみたいなことも一応出来るし
ただまぁ・・・労力に見合うか、というと散々だわマジで。
持て囃すようなものでは決してない(他人のふんどしでドヤりたい連中が持て囃してるだけ
こういう書き方出来たら便利なのにな、とかを無理矢理実現できるというロマンはある
(マクロと似たようなもんだが
プロパティみたいなことも一応出来るし
ただまぁ・・・労力に見合うか、というと散々だわマジで。
持て囃すようなものでは決してない(他人のふんどしでドヤりたい連中が持て囃してるだけ
206デフォルトの名無しさん
2021/04/15(木) 00:59:45.76ID:5MHywbxF >>203
まあ実際ビルドシステムを自分で構築するかコンパイラにやらせるかの違いしかない。
フーリエ変換の係数みたいなものを事前に設定するとかは少し便利かもね。
それなりに手計算すると大変だけれどそこまで本格的に計算時間がかからないような
事前計算できて使いまわせるようなものが念頭にあるんだろうが、まあそんなないわな。
まあ実際ビルドシステムを自分で構築するかコンパイラにやらせるかの違いしかない。
フーリエ変換の係数みたいなものを事前に設定するとかは少し便利かもね。
それなりに手計算すると大変だけれどそこまで本格的に計算時間がかからないような
事前計算できて使いまわせるようなものが念頭にあるんだろうが、まあそんなないわな。
207はちみつ餃子 ◆8X2XSCHEME
2021/04/15(木) 01:11:57.17ID:FEj8Wx1j 状況に応じてコードジェネレータを用意するよりはマシってくらいか。
208デフォルトの名無しさん
2021/04/15(木) 22:12:02.69ID:mdNAsIkh >>182
具体的に
具体的に
209デフォルトの名無しさん
2021/04/16(金) 05:29:55.48ID:EjuTOEDD >>208
?
?
210デフォルトの名無しさん
2021/04/16(金) 06:24:07.51ID:zpAq69hN >>209
?!
?!
211はちみつ餃子 ◆8X2XSCHEME
2021/04/16(金) 12:18:05.12ID:I3AyWR5p ヴィクトル・ユーゴーかよ。
212デフォルトの名無しさん
2021/04/17(土) 08:00:06.17ID:1dxAtZcl condition_variableってなんでこんなに面倒なんだ
winなら、イベントの方が高速だし楽で懐疑起床も起きないし
winなら、イベントの方が高速だし楽で懐疑起床も起きないし
213デフォルトの名無しさん
2021/04/17(土) 08:06:00.96ID:3mxJ/fRx214デフォルトの名無しさん
2021/04/17(土) 08:13:31.45ID:nI8O4VG/215デフォルトの名無しさん
2021/04/17(土) 08:49:19.47ID:1dxAtZcl216デフォルトの名無しさん
2021/04/17(土) 10:51:59.94ID:WHLcQryV おすすめ本ってありますか?
C言語のプログラムを、文法などカンニングしながら書けるレベルです。
C言語のプログラムを、文法などカンニングしながら書けるレベルです。
217デフォルトの名無しさん
2021/04/17(土) 13:30:52.06ID:l53+7OwH cppreference.comの何が不満かによる
218デフォルトの名無しさん
2021/04/17(土) 14:51:21.11ID:ohP60UMx それだけ読んで理解した奴なんておらんやろ。
219デフォルトの名無しさん
2021/04/17(土) 17:33:14.75ID:3mxJ/fRx プログラミングにカンニングという概念はない
常にオンラインヘルプなので正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約ぶ追従)は仕事の一部
常にオンラインヘルプなので正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約ぶ追従)は仕事の一部
220デフォルトの名無しさん
2021/04/17(土) 17:41:48.19ID:3mxJ/fRx 訂正
プログラミングにカンニングという概念はない
常にオンラインヘルプなどで正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約に追従)は仕事の一部
明確なコーディング規約がない場合にはなおのこと、カンニングが重要になる
プログラミングにカンニングという概念はない
常にオンラインヘルプなどで正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約に追従)は仕事の一部
明確なコーディング規約がない場合にはなおのこと、カンニングが重要になる
221デフォルトの名無しさん
2021/04/17(土) 18:08:39.80ID:LyWUtAnN RTTIなんかカンニングだろって個人的に思う
222デフォルトの名無しさん
2021/04/17(土) 19:10:13.22ID:3mxJ/fRx condition_variableに似た関数SleepConditionVariableCS()がWin32APIにも用意されてるけど、直感的で使いやすいのはcondition_variableでしょ
https://docs.microsoft.com/en-us/windows/win32/sync/using-condition-variables
https://docs.microsoft.com/en-us/windows/win32/sync/using-condition-variables
223デフォルトの名無しさん
2021/04/18(日) 10:59:46.23ID:lylRPiha 質問なのですが教えてくだちい
Q1. 64 bit符号付整数の積の結果をオーバーフロー無しで(128 bit等で)で得る方法
※ 64 bit整数を2^32進数2桁とみなして筆算する処理より速い方法キボン
SSE4.1可
Q2. (Q1にうまいやり方が無い場合)64 bit符号付整数の積がオーバーフローしたことを検知する方法
Q3. 多倍長整数(例えば8要素のunsigned longの配列として表された符号無し整数0〜2^256-1)
を10で割る方法orz
Q1. 64 bit符号付整数の積の結果をオーバーフロー無しで(128 bit等で)で得る方法
※ 64 bit整数を2^32進数2桁とみなして筆算する処理より速い方法キボン
SSE4.1可
Q2. (Q1にうまいやり方が無い場合)64 bit符号付整数の積がオーバーフローしたことを検知する方法
Q3. 多倍長整数(例えば8要素のunsigned longの配列として表された符号無し整数0〜2^256-1)
を10で割る方法orz
224デフォルトの名無しさん
2021/04/18(日) 11:05:45.65ID:lylRPiha Q2は現状a*bの前に std::abs(a) <= std::numeric_limit<int64_t>::max / std::abs(b) という判定をやっているのですが
もっと速いやつ(除算不要のやつ)キボン、
もっと速いやつ(除算不要のやつ)キボン、
225デフォルトの名無しさん
2021/04/18(日) 13:15:25.56ID:aOZ5UqSE226デフォルトの名無しさん
2021/04/18(日) 14:35:23.87ID:HGo0FTuj winならMultiply128、gccやclangなら__int128ってのが使えるみたいだけど
227デフォルトの名無しさん
2021/04/18(日) 15:14:50.22ID:regwJJSX 競技プログラミングではよくある質問
228デフォルトの名無しさん
2021/04/18(日) 17:15:30.07ID:B2k51TVB >>223
特定の環境ならアセンブラでやっちゃえば?
ちなみに環境は?
昔その辺の演算は良くやった
Q3は10の逆数を求めておいてかけ算命令でやるのが良いけど
多売長は何進数?
10で割るだけの為にバッファスキャンはもったいない
何かの演算とセットに出来ない?
もしやりたいことが2進多倍長の10進数化なら
もっと良い方法がある
特定の環境ならアセンブラでやっちゃえば?
ちなみに環境は?
昔その辺の演算は良くやった
Q3は10の逆数を求めておいてかけ算命令でやるのが良いけど
多売長は何進数?
10で割るだけの為にバッファスキャンはもったいない
何かの演算とセットに出来ない?
もしやりたいことが2進多倍長の10進数化なら
もっと良い方法がある
229デフォルトの名無しさん
2021/04/18(日) 17:17:36.41ID:B2k51TVB 環境 (CPU, OS)
多倍長の構成 (整数?指数部あり?2進?10進?変則?)
最終的に何がやりたいか
この辺がわかれば色々と教えられる
多倍長の構成 (整数?指数部あり?2進?10進?変則?)
最終的に何がやりたいか
この辺がわかれば色々と教えられる
>>223
>>225 も多倍長演算ですか、じゃ、私も私の多倍長演算を
https://mevius.5ch.net/test/read.cgi/tech/1434079972/37
>Q3. 多倍長整数を10で割る方法
であれば上のリンク先の line:383 から、std::ostream &operator<<(std::ostream &stream, mpz_base_class c) にて、ちょこっと工夫したつもりです、剰余は下位から確定する点では普通、ですので順序を逆にするのはアレかもしれませんが
>>225 も多倍長演算ですか、じゃ、私も私の多倍長演算を
https://mevius.5ch.net/test/read.cgi/tech/1434079972/37
>Q3. 多倍長整数を10で割る方法
であれば上のリンク先の line:383 から、std::ostream &operator<<(std::ostream &stream, mpz_base_class c) にて、ちょこっと工夫したつもりです、剰余は下位から確定する点では普通、ですので順序を逆にするのはアレかもしれませんが
231デフォルトの名無しさん
2021/04/18(日) 18:08:23.13ID:lylRPiha232デフォルトの名無しさん
2021/04/18(日) 18:32:04.62ID:2o2Y05bZ 多倍長÷32bitを除算命令を用いてやるのはアホ
233デフォルトの名無しさん
2021/04/18(日) 18:34:03.31ID:lylRPiha >>232
kwsk
kwsk
234デフォルトの名無しさん
2021/04/18(日) 19:14:51.87ID:2o2Y05bZ ヒント
除算は遅い
除算は逆数の乗算
定数の除算のコンパイル結果
除算は遅い
除算は逆数の乗算
定数の除算のコンパイル結果
235デフォルトの名無しさん
2021/04/18(日) 21:49:11.94ID:lylRPiha (聞くんじゃなかった…
236デフォルトの名無しさん
2021/04/18(日) 22:02:51.07ID:lylRPiha ちゅか10で割るのは10の剰余を知りたいからなのだというのは
言ってなかったわサーセン、orz
多倍長整数の10進数表現を得るために、多倍長整数を10で割って剰余を求める必要があった
この目的には誤差の見積や処置が面倒な方法はNGでありかつ
10進数化とかどうせ表示の時しか使わないのでこの割り算自体はそうメチャクチャチューニングする必要は
ありませぬ(と後出し
言ってなかったわサーセン、orz
多倍長整数の10進数表現を得るために、多倍長整数を10で割って剰余を求める必要があった
この目的には誤差の見積や処置が面倒な方法はNGでありかつ
10進数化とかどうせ表示の時しか使わないのでこの割り算自体はそうメチャクチャチューニングする必要は
ありませぬ(と後出し
237デフォルトの名無しさん
2021/04/18(日) 22:16:10.35ID:lylRPiha もしガチで全く除算を使わずに10進数に変換せよと言われたら
5*10^n、2*10^n、1*10^nを作ってnがデカい順に元の数と比較して引いていく、
ぐらいしかなさげ
知らんけど
5*10^n、2*10^n、1*10^nを作ってnがデカい順に元の数と比較して引いていく、
ぐらいしかなさげ
知らんけど
238デフォルトの名無しさん
2021/04/19(月) 00:09:37.42ID:cH3u5yp0 >>223
トンチンカンなこと聞いてたらすみませんが、Q1って多倍長整数を文字列で持ってカラツバ法とか高速フーリエ変換で計算するやり方だと「遅い」んですか?
トンチンカンなこと聞いてたらすみませんが、Q1って多倍長整数を文字列で持ってカラツバ法とか高速フーリエ変換で計算するやり方だと「遅い」んですか?
>>238
>カラツバ法とか高速フーリエ変換で計算するやり方だと「遅い」んですか?
これらは、オーダーは O(n^2) より下のクラスなので速いのはそのとおりですが、しかし使えるのは掛け算のときだけですね
まあ逆数を掛けるという意味では割り算も OK かもしれません、そして逆数計算は「単桁 vs 多桁」だから、オーダーは無視できますし
それはそうと、昔バグっていた例のペンティアムの除算アルゴリズムを解説してくれるサイトはないですかね‥‥
>カラツバ法とか高速フーリエ変換で計算するやり方だと「遅い」んですか?
これらは、オーダーは O(n^2) より下のクラスなので速いのはそのとおりですが、しかし使えるのは掛け算のときだけですね
まあ逆数を掛けるという意味では割り算も OK かもしれません、そして逆数計算は「単桁 vs 多桁」だから、オーダーは無視できますし
それはそうと、昔バグっていた例のペンティアムの除算アルゴリズムを解説してくれるサイトはないですかね‥‥
>>236
いいわすれましたが、商が高速に求められれば、剰余は 被除数−商×除数、で求めるものですし、多分高速除算・高速剰余計算は多分そうしているでしょうね
いいわすれましたが、商が高速に求められれば、剰余は 被除数−商×除数、で求めるものですし、多分高速除算・高速剰余計算は多分そうしているでしょうね
242デフォルトの名無しさん
2021/04/19(月) 00:33:03.64ID:cH3u5yp0 >>240
質問者は掛け算と10で割る (小数点以下は無視する割り算ですよね?) しか聞いてないので、掛け算さえできれば良くないですか?
質問者は掛け算と10で割る (小数点以下は無視する割り算ですよね?) しか聞いてないので、掛け算さえできれば良くないですか?
243デフォルトの名無しさん
2021/04/19(月) 00:37:49.63ID:cH3u5yp0 ああ、10で割るのはあまりを求めたいからって書いてあった
でも10で割った余りって1の位の数字ですよね?
そんな話じゃない?
でも10で割った余りって1の位の数字ですよね?
そんな話じゃない?
244デフォルトの名無しさん
2021/04/19(月) 00:39:51.82ID:cH3u5yp0 まあいいや
チューニングする必要はないって話なんで、わり算の話は置いといて、結局やりたいのは整数同士の掛け算ですよね?
チューニングする必要はないって話なんで、わり算の話は置いといて、結局やりたいのは整数同士の掛け算ですよね?
245デフォルトの名無しさん
2021/04/19(月) 00:45:58.97ID:r2ULphPG 質問者が情報を後出ししたりしていてイマイチ信用に欠けるので、普通の整数のように何でもできる多倍長整数がほしいのか掛け算さえできればOKなのかは不明
247デフォルトの名無しさん
2021/04/19(月) 00:49:32.73ID:cH3u5yp0 >>247
最初から10進で数値を持つと、加減算ですら速度が低下します
10進化の頻度は各種演算の頻度よりも少ない、というか、演算を何千回・何万回した最後に 10 進に変換する、かもしれない、っていう状況で、最初から 10 進で持つのは無駄以外の何ものでもないかと
それに32bit までは BCD 補正命令がありましたが 64 bit の今は BCD 補正命令(AAA とかね)ですら削除されちゃっていますし
最初から10進で数値を持つと、加減算ですら速度が低下します
10進化の頻度は各種演算の頻度よりも少ない、というか、演算を何千回・何万回した最後に 10 進に変換する、かもしれない、っていう状況で、最初から 10 進で持つのは無駄以外の何ものでもないかと
それに32bit までは BCD 補正命令がありましたが 64 bit の今は BCD 補正命令(AAA とかね)ですら削除されちゃっていますし
249デフォルトの名無しさん
2021/04/19(月) 02:16:04.24ID:hAOdtYDs >>248
質問者は加減算はするんですか?
質問者は加減算はするんですか?
250デフォルトの名無しさん
2021/04/19(月) 02:16:30.94ID:hAOdtYDs ID変わってますが同じ人です
251デフォルトの名無しさん
2021/04/19(月) 06:59:05.63ID:6wuAqTFP 一応私
東大大型計算機センター時代に円周率ギネスに関わったこともあって
多倍長の知識や技術は確実にこのスレで一番だと思うのだけど
スルーするなら消えるね
東大大型計算機センター時代に円周率ギネスに関わったこともあって
多倍長の知識や技術は確実にこのスレで一番だと思うのだけど
スルーするなら消えるね
252デフォルトの名無しさん
2021/04/19(月) 07:39:37.59ID:MiZJ3RJg だって多倍長「整数」、と最初に断ってあるのに小数や指数表示の話を始めそうなふいんきだったし、
Q1、Q2に関しては64 bit同士の積の話なので
今日日のなんちゃら漸化式を使う円周率計算とかに使う
多倍長の掛け算みたいな別次元テクニックは明らかに使いどころが無いいいし……
Q1、Q2に関しては64 bit同士の積の話なので
今日日のなんちゃら漸化式を使う円周率計算とかに使う
多倍長の掛け算みたいな別次元テクニックは明らかに使いどころが無いいいし……
253デフォルトの名無しさん
2021/04/19(月) 07:53:01.92ID:MiZJ3RJg >>249
する
ただしQ1とQ2の質問の直接の範囲ではありません
しかし、とはいいつつ筆算のアルゴリズムで実装したら必要になったので
とりいそぎ加減算を実装してみた(>>231
Q3は多倍長整数を32 bit整数で割るやり方をガチで忘れたので質問したorz
のですが途中で思い出し実装した、というろくでもない経緯ですたサーセン、
>>235はついカッとなって書いた>>234の人はスマンカッタorz
今後の方向性としてはコンパイラはVCを使っているのでSSE4.1のイントリンシックを使って
お手軽に64 bitデータの積和を128 bit幅で計算する方向なキモス
>>239
>キャリーフラグやゼロフラグを触れるのはアセンブラしかないですからね
それは思わないでもないが積をやりだすと上位桁への伝搬が1 bitでは済まないので
C/C++ だけで多倍長を実装するのは結果オーライかと、
する
ただしQ1とQ2の質問の直接の範囲ではありません
しかし、とはいいつつ筆算のアルゴリズムで実装したら必要になったので
とりいそぎ加減算を実装してみた(>>231
Q3は多倍長整数を32 bit整数で割るやり方をガチで忘れたので質問したorz
のですが途中で思い出し実装した、というろくでもない経緯ですたサーセン、
>>235はついカッとなって書いた>>234の人はスマンカッタorz
今後の方向性としてはコンパイラはVCを使っているのでSSE4.1のイントリンシックを使って
お手軽に64 bitデータの積和を128 bit幅で計算する方向なキモス
>>239
>キャリーフラグやゼロフラグを触れるのはアセンブラしかないですからね
それは思わないでもないが積をやりだすと上位桁への伝搬が1 bitでは済まないので
C/C++ だけで多倍長を実装するのは結果オーライかと、
254デフォルトの名無しさん
2021/04/19(月) 08:16:03.30ID:6wuAqTFP その>>234だけど
まあ素人同士で頑張って
まあ素人同士で頑張って
255デフォルトの名無しさん
2021/04/19(月) 08:27:12.50ID:6wuAqTFP 2進多倍長の10進化にQ3を使うのはアホ
これだけは書いておいてあげる
これだけは書いておいてあげる
256デフォルトの名無しさん
2021/04/19(月) 08:36:36.63ID:wJLYJwE7 122=235か。
お前もう質問するなよ
お前もう質問するなよ
257デフォルトの名無しさん
2021/04/19(月) 08:47:34.79ID:cH3u5yp0 >>253
多倍長がどれほど多倍長かというのにもよりますが、とにかく速いQ1の回答はカラツバ法とか整数環上でFFTして畳み込みだと思います
Q3はそもそも多倍長整数をどう持つかによるので、仕様を確定しないと難しいんじゃないでしょうか
多倍長がどれほど多倍長かというのにもよりますが、とにかく速いQ1の回答はカラツバ法とか整数環上でFFTして畳み込みだと思います
Q3はそもそも多倍長整数をどう持つかによるので、仕様を確定しないと難しいんじゃないでしょうか
258デフォルトの名無しさん
2021/04/19(月) 08:51:43.03ID:cH3u5yp0 あ、64ビットにおさまるくらいの桁数の話なんですね
だったらパースとかするオーバーヘッドが大きそうなので、僕の言った方法は有効じゃなさそうです
失礼しました
だったらパースとかするオーバーヘッドが大きそうなので、僕の言った方法は有効じゃなさそうです
失礼しました
259デフォルトの名無しさん
2021/04/19(月) 08:55:57.38ID:RwTjYqyx 肩書きとかキャリアを己の発言の信憑性の根拠にするって、お前ここはニュー速VIPじゃないんだぞ
260デフォルトの名無しさん
2021/04/19(月) 12:17:34.06ID:zMLTVIrM261デフォルトの名無しさん
2021/04/19(月) 12:25:33.89ID:RwTjYqyx いやクソどうでも良いんだが
捨て台詞 (>>254) 吐いて退場したけど勘違いされてたら悪いと思って戻ってきたの?
捨て台詞 (>>254) 吐いて退場したけど勘違いされてたら悪いと思って戻ってきたの?
262デフォルトの名無しさん
2021/04/19(月) 12:34:37.87ID:zMLTVIrM >>257がバカ発言してて
同じ人と思われたらイヤだなあと思って
同じ人と思われたらイヤだなあと思って
263デフォルトの名無しさん
2021/04/19(月) 12:54:00.52ID:hAOdtYDs264デフォルトの名無しさん
2021/04/19(月) 13:17:17.86ID:zh6rCSPG こんなところで身バレしそうな職歴晒してまでどうしたいんだろう
時々いる煽り耐性ゼロの人かな
時々いる煽り耐性ゼロの人かな
265デフォルトの名無しさん
2021/04/19(月) 13:36:43.08ID:dtIEXEiV いやフツーに嘘でしょ
精々が
・学生のときにデカいプロジェクトに名前だけ入ってた
・技官がイキってる
・隣の研究室にいた
くらいじゃない
> 東大大型計算機センター時代に円周率ギネスに関わったこともあって
「関わった」という控えめで奥ゆかしい言い方を思えば、PIとかそのクラスではないことは明らか
精々が
・学生のときにデカいプロジェクトに名前だけ入ってた
・技官がイキってる
・隣の研究室にいた
くらいじゃない
> 東大大型計算機センター時代に円周率ギネスに関わったこともあって
「関わった」という控えめで奥ゆかしい言い方を思えば、PIとかそのクラスではないことは明らか
266デフォルトの名無しさん
2021/04/19(月) 16:48:40.50ID:mIgsEenU 盛り上がってるところすいません
マルチスレッドで1バイトの変数に対してatomicな操作をしたいのですが
ロックフリーで行いたい場合
ATOMIC_CHAR_LOCK_FREEの値が2以外の場合は保証されないのでしょうか?
マルチスレッドで1バイトの変数に対してatomicな操作をしたいのですが
ロックフリーで行いたい場合
ATOMIC_CHAR_LOCK_FREEの値が2以外の場合は保証されないのでしょうか?
267デフォルトの名無しさん
2021/04/19(月) 17:02:33.15ID:ssZtrIut268デフォルトの名無しさん
2021/04/19(月) 17:22:54.26ID:utLkXQPz 規格的にはそうですとしか言えんわな
現実的にはともかく
現実的にはともかく
269デフォルトの名無しさん
2021/04/19(月) 17:30:46.64ID:mIgsEenU270デフォルトの名無しさん
2021/04/19(月) 18:10:02.15ID:6wuAqTFP271デフォルトの名無しさん
2021/04/19(月) 18:10:29.58ID:6wuAqTFP272デフォルトの名無しさん
2021/04/19(月) 18:11:36.17ID:HuLqOw9z >>269
マルチスレッドが使えない環境かな
マルチスレッドが使えない環境かな
273デフォルトの名無しさん
2021/04/19(月) 19:29:48.98ID:xQPYHIMj274デフォルトの名無しさん
2021/04/19(月) 20:10:17.57ID:6wuAqTFP バカにはわからない
275デフォルトの名無しさん
2021/04/20(火) 01:11:18.41ID:lQgqPl99 言語、規格バカはマジでウザい
ちょっとした言い間違いで、配列とポインタについて
30分語られたわ
先輩だから、聞いてやったけど・・・
そいつ、仕事できないなくてハブられてるwww
ちょっとした言い間違いで、配列とポインタについて
30分語られたわ
先輩だから、聞いてやったけど・・・
そいつ、仕事できないなくてハブられてるwww
276デフォルトの名無しさん
2021/04/20(火) 04:53:21.68ID:MRJwD2x4 30分しか語れないんじゃそりゃハブられるわ
ポインタだけで1日終わるくらいがスタートラインだろ
ポインタだけで1日終わるくらいがスタートラインだろ
277デフォルトの名無しさん
2021/04/20(火) 06:53:00.02ID:RELc90o2 C++に関しては知識と開発能力が比例しないということを採用担当者は知っておくべき
278デフォルトの名無しさん
2021/04/20(火) 07:17:36.48ID:xhmy6KmQ C++20が憶えきれない
こんなことは初めてだ
こんなことは初めてだ
279デフォルトの名無しさん
2021/04/20(火) 08:09:40.68ID:Hk0/CBHu 配列とポインタは混同してると危険だから怪しいこと言ってる奴がチームにいたら捕まえて説明するよ
どんな言い間違いか知らんけど心配させるようなこと言う方が悪い
どんな言い間違いか知らんけど心配させるようなこと言う方が悪い
280デフォルトの名無しさん
2021/04/20(火) 08:30:33.16ID:ipiVKlKV こんなとこに同僚の愚痴書いて気晴らししてるやつが仕事できるとは到底思えないな。
281デフォルトの名無しさん
2021/04/20(火) 10:14:33.25ID:v3OtCzj2 同僚と先輩の区別もつかない奴はプログラマーには向いてない
282デフォルトの名無しさん
2021/04/20(火) 10:52:16.13ID:9UAiU1Oe linuxとwindowsで使える共通の開発環境ってなんでしょうか?
guiアプリを作りる場合です
エディタ:vscode
言語:c++
gui:qt
という感じですか?
pythonやelecrtonなんかもありますね
guiアプリを作りる場合です
エディタ:vscode
言語:c++
gui:qt
という感じですか?
pythonやelecrtonなんかもありますね
283デフォルトの名無しさん
2021/04/20(火) 12:10:41.97ID:VvQCOD1T284デフォルトの名無しさん
2021/04/20(火) 12:18:00.63ID:YUL53Jgh Karatsuba法を実装できるから実装してみた
https://ideone.com/W1j1o0
Karatsuba法推しの香具師はいっぺん自力で実装してみたらいいかもしんない
かもしんない運転、
言うは易しの好例に思えるorz、、、
https://ideone.com/W1j1o0
Karatsuba法推しの香具師はいっぺん自力で実装してみたらいいかもしんない
かもしんない運転、
言うは易しの好例に思えるorz、、、
285デフォルトの名無しさん
2021/04/20(火) 12:18:13.99ID:VIg6RvGl >>281
辞書くらい持ってるだろ?日本語も勉強しような
辞書くらい持ってるだろ?日本語も勉強しような
286デフォルトの名無しさん
2021/04/20(火) 12:36:36.65ID:q1a39yZP287デフォルトの名無しさん
2021/04/20(火) 12:42:32.22ID:VIg6RvGl >>286
そこ区別して同僚の愚痴を先輩の愚痴に書き換えたところでなにも変わらんだろアホ
そこ区別して同僚の愚痴を先輩の愚痴に書き換えたところでなにも変わらんだろアホ
288デフォルトの名無しさん
2021/04/20(火) 12:43:21.01ID:X7tfUSAH 技術的な話で太刀打ちできなさそうだと枝葉末節で揚げ足取りが始まる掲示板はどこでしょう?
そう、ここです!
そう、ここです!
289デフォルトの名無しさん
2021/04/20(火) 12:43:25.81ID:foxJ/HUw290デフォルトの名無しさん
2021/04/20(火) 13:00:09.50ID:xhmy6KmQ291デフォルトの名無しさん
2021/04/20(火) 13:46:48.72ID:NNyYGUS8292デフォルトの名無しさん
2021/04/20(火) 13:47:04.64ID:9UAiU1Oe293デフォルトの名無しさん
2021/04/20(火) 14:16:30.60ID:fd+AEuq4 C++11以降はそれ以前のC++とまるで別の言語のような感さえある。
だが基本中の基本である文字列操作がJavaやPythonほど簡単になってないのが残念。
だが基本中の基本である文字列操作がJavaやPythonほど簡単になってないのが残念。
294デフォルトの名無しさん
2021/04/20(火) 15:06:35.17ID:VvQCOD1T295デフォルトの名無しさん
2021/04/20(火) 15:35:17.43ID:9UAiU1Oe linuxでopenglやりたいので、c++かなと。
296デフォルトの名無しさん
2021/04/20(火) 20:37:50.18ID:Pk69v7H3297デフォルトの名無しさん
2021/04/20(火) 20:42:34.03ID:NN6yC6GV しったか乙
298デフォルトの名無しさん
2021/04/20(火) 20:55:33.24ID:Pk69v7H3 まあどの道64ビットに収まる桁数だったら意味ないってことは上で結論出てるけどな
299デフォルトの名無しさん
2021/04/20(火) 21:01:48.70ID:YUL53Jgh 掲示したソースコードにおける
最適化に対するメモリエリアシングの影響について:
最適化に対するメモリエリアシングの影響について:
300デフォルトの名無しさん
2021/04/20(火) 21:25:08.48ID:odq3qVNb クラスに特定のoperatorが定義されているか調べるために、
以下のようなtemplateを作ってMSVCでもclangでも一応期待通りに動いてはいるんだが、
VS2019のintelliSenseの解析が異常終了するらしく機能しなくなるんだよね、VS2017は大丈夫なんだけども
何か変かな?
template < typename OPERATOR, typename T > class has_operator
{
private:
template < typename U > static auto check(U x) -> decltype(x.operator OPERATOR(), std::true_type());
static std::false_type check(...);
public:
static bool const value = decltype(check(std::declval<T>()))::value;
};
以下のようなtemplateを作ってMSVCでもclangでも一応期待通りに動いてはいるんだが、
VS2019のintelliSenseの解析が異常終了するらしく機能しなくなるんだよね、VS2017は大丈夫なんだけども
何か変かな?
template < typename OPERATOR, typename T > class has_operator
{
private:
template < typename U > static auto check(U x) -> decltype(x.operator OPERATOR(), std::true_type());
static std::false_type check(...);
public:
static bool const value = decltype(check(std::declval<T>()))::value;
};
>>284
>Karatsuba法推しの香具師はいっぺん自力で実装してみたらいいかもしんない
わたしも、やろう、やろう、とおもってても最後は「この野郎」になってしまうのです
カラツバ、今の私には強敵です…
>Karatsuba法推しの香具師はいっぺん自力で実装してみたらいいかもしんない
わたしも、やろう、やろう、とおもってても最後は「この野郎」になってしまうのです
カラツバ、今の私には強敵です…
302デフォルトの名無しさん
2021/04/20(火) 22:33:18.23ID:nuXnJUWD 桁数nとしてカラツバはおよそnの1.6乗でFFTならnlognなのになぜか皆カラツバの方をチョイスしててワロ
文系の皆さんにはフーリエ変換なんて難し過ぎるか
文系の皆さんにはフーリエ変換なんて難し過ぎるか
303デフォルトの名無しさん
2021/04/20(火) 22:35:49.17ID:nuXnJUWD FFTの方は奥村のCアルゴリズム本に載ってるからアクセスしやすいけどね
カラツバはクヌース本くらいしか知らん
カラツバはクヌース本くらいしか知らん
305デフォルトの名無しさん
2021/04/21(水) 06:19:59.72ID:Y7fj3JnX QZは高卒だったのか
306デフォルトの名無しさん
2021/04/21(水) 09:14:33.98ID:d8/E1L9C307デフォルトの名無しさん
2021/04/21(水) 10:43:52.09ID:NcgxI3iC 高卒・・・そんなんで偉そうに留数定理とかのたまってたのか
308デフォルトの名無しさん
2021/04/21(水) 10:46:51.63ID:T8R/7AcW 複素数に関するアレコレが指導要領に入ってた頃の高卒だと思うと逆に悲しいな笑
309デフォルトの名無しさん
2021/04/21(水) 10:52:21.72ID:NcgxI3iC いや高校では複素解析やらんだろ・・
310デフォルトの名無しさん
2021/04/21(水) 10:55:55.53ID:d8/E1L9C 誘導してんだからあっち行けよ
311デフォルトの名無しさん
2021/04/21(水) 11:11:39.04ID:DSKXDkbA312デフォルトの名無しさん
2021/04/21(水) 11:15:29.03ID:bCpwaxws313デフォルトの名無しさん
2021/04/21(水) 11:23:22.29ID:DSKXDkbA314デフォルトの名無しさん
2021/04/21(水) 11:37:50.39ID:f6qdR5OJ QZを批判すると必ず現れるD:DSKXDkbAみたいな奴
怪しい
同一人物だろうな
QZは>>304と同じIDで書き込みしてみろよ
無理だろうがなw
それに多価関数がわからないと泣いていたよなQZww
哀れ過ぎる
怪しい
同一人物だろうな
QZは>>304と同じIDで書き込みしてみろよ
無理だろうがなw
それに多価関数がわからないと泣いていたよなQZww
哀れ過ぎる
315デフォルトの名無しさん
2021/04/21(水) 11:43:42.91ID:T8R/7AcW >>304は昨日なので、同じIDが出せたらモノホンのハッカーでは
316デフォルトの名無しさん
2021/04/21(水) 11:45:25.27ID:f6qdR5OJ なるほど
昨日だから今日これだけ暴れているのか
なおさら哀れになってくる
実際の自分より良く見せようとする病気=自己愛性パーソナリティ障害
昨日だから今日これだけ暴れているのか
なおさら哀れになってくる
実際の自分より良く見せようとする病気=自己愛性パーソナリティ障害
317デフォルトの名無しさん
2021/04/21(水) 12:05:54.31ID:tWbCEelV 技術系の板に精神分析を書き込む人って、その人自身が精神を病んだ経験ありそう
鏡に話しかけてる感じ
お大事に
鏡に話しかけてる感じ
お大事に
318デフォルトの名無しさん
2021/04/21(水) 12:17:39.89ID:v7jA28gl319デフォルトの名無しさん
2021/04/21(水) 12:17:53.81ID:ysdTsnNz320デフォルトの名無しさん
2021/04/21(水) 12:18:17.72ID:S0SCN4KK 言語規格厨のウザさは以上
コピー代入が、ムーブ代入がってそんなことより
さっさと仕事しろよ
工数足りないんだよ
コピー代入が、ムーブ代入がってそんなことより
さっさと仕事しろよ
工数足りないんだよ
321デフォルトの名無しさん
2021/04/21(水) 13:43:53.29ID:iJBMse6c それマ板向きの話題
煽りとかでなくわりとまじで
煽りとかでなくわりとまじで
322デフォルトの名無しさん
2021/04/21(水) 16:19:12.57ID:Xwi7hGL+323デフォルトの名無しさん
2021/04/21(水) 16:40:24.72ID:d8/E1L9C どうせならエトルフィン出してもらえよ
324デフォルトの名無しさん
2021/04/21(水) 16:49:56.10ID:tWbCEelV な、自作自演で同一人物が書き込んでいると思い込んでるだろ?
やたらと薬物(合法)の名前に詳しいだろ
この辺が病んでいる・病んでいた証拠なんだよ
やたらと薬物(合法)の名前に詳しいだろ
この辺が病んでいる・病んでいた証拠なんだよ
326デフォルトの名無しさん
2021/04/21(水) 17:11:51.30ID:BQWVCdUr 薬の名前はQZが自分で書いてたんだぞ
http://peace.2ch.net/test/read.cgi/tech/1313183984/303
>303 名前: ◆QZaw55cn4c [] 投稿日:2012/07/28(土) 18:08:51.36
>>>302
>飲んでるお薬 http://upload.wikimedia.org/wikipedia/commons/c/c2/Thorazine_advert.jpg
http://peace.2ch.net/test/read.cgi/tech/1313183984/303
>303 名前: ◆QZaw55cn4c [] 投稿日:2012/07/28(土) 18:08:51.36
>>>302
>飲んでるお薬 http://upload.wikimedia.org/wikipedia/commons/c/c2/Thorazine_advert.jpg
327デフォルトの名無しさん
2021/04/21(水) 17:57:01.32ID:d8/E1L9C328デフォルトの名無しさん
2021/04/21(水) 19:51:15.95ID:Y7fj3JnX どうでもいい
329デフォルトの名無しさん
2021/04/21(水) 19:58:40.75ID:2oKQsBoE >>284のKaratuba法のコードには計算結果に影響するバグがあった(爆
修正したやつを貼る、
https://ideone.com/mhRQte
バグとしては、>>284のままでは次の計算を誤る。
0xffffffffffffffffに対し0x0000000100000001を乗算
Num in hexa: 0xFFFFFFFEFFFFFFFF <== BUG!
Expected: 0x100000000FFFFFFFEFFFFFFFF
げいいんは、Karatuba法であるmul_mlen_mlen()の末尾で
z2 * 2^(b+1) + z0 に対し、z1 * 2^bを加算する
という演算をやっているのですだが、桁上がりをきちんと2^(b+2)のワードまで
伝えていなかった、|||。n_
あと細かい点として、符号反転を0に対して無駄に行う個所があったのでそこも修正すた、
カナーリ切羽詰まってきているのでレスはあとでまとめて読みませていただきまつ以下略、
修正したやつを貼る、
https://ideone.com/mhRQte
バグとしては、>>284のままでは次の計算を誤る。
0xffffffffffffffffに対し0x0000000100000001を乗算
Num in hexa: 0xFFFFFFFEFFFFFFFF <== BUG!
Expected: 0x100000000FFFFFFFEFFFFFFFF
げいいんは、Karatuba法であるmul_mlen_mlen()の末尾で
z2 * 2^(b+1) + z0 に対し、z1 * 2^bを加算する
という演算をやっているのですだが、桁上がりをきちんと2^(b+2)のワードまで
伝えていなかった、|||。n_
あと細かい点として、符号反転を0に対して無駄に行う個所があったのでそこも修正すた、
カナーリ切羽詰まってきているのでレスはあとでまとめて読みませていただきまつ以下略、
330デフォルトの名無しさん
2021/04/21(水) 20:01:20.31ID:9Ni9X3TR げいいん
331デフォルトの名無しさん
2021/04/21(水) 20:20:55.73ID:Y7fj3JnX ダサ
332デフォルトの名無しさん
2021/04/21(水) 20:22:03.31ID:tWbCEelV 🍺🐋鯨飲🐳
C++と関係ない話ばっかりだな
C++と関係ない話ばっかりだな
333デフォルトの名無しさん
2021/04/22(木) 00:17:13.55ID:ru2ShUiK334デフォルトの名無しさん
2021/04/22(木) 06:53:49.94ID:WQGVMWvQ mul_mlen_mlen()自体は桁数がスゲー長いケース(任意長)に対応していることは読めばワカル
Wrapperであるmul_u64_64()が128 ビットでそれを使っているというだけ
Wrapperであるmul_u64_64()が128 ビットでそれを使っているというだけ
335デフォルトの名無しさん
2021/04/22(木) 06:58:17.03ID:HV6xjPl7 いや、カラツバなんか実装する意味ねえつってるんだがどこまで馬鹿なんだ
336デフォルトの名無しさん
2021/04/22(木) 07:17:22.47ID:WQGVMWvQ337デフォルトの名無しさん
2021/04/22(木) 07:32:14.23ID:/jtf723l だめだこりゃ
338デフォルトの名無しさん
2021/04/22(木) 08:16:22.82ID:wJAS8IOG 桁数がスゲー長いケースならカラツバなんか使わんし
数倍長程度でも使わん
もちろん速度やリソースを無視して単に動くって意味なら何でも良い好きにしろ
数倍長程度でも使わん
もちろん速度やリソースを無視して単に動くって意味なら何でも良い好きにしろ
339デフォルトの名無しさん
2021/04/22(木) 10:16:28.69ID:yNSfYish long longで足りんとき俺はgmp使う
340デフォルトの名無しさん
2021/04/22(木) 11:19:45.75ID:ZUdmCczU おれはlong long long使う
341デフォルトの名無しさん
2021/04/22(木) 11:45:41.25ID:lbVcz3R2342デフォルトの名無しさん
2021/04/22(木) 11:45:53.93ID:aclQQfDP お前らlong long long long使えるのしらねーの?
343デフォルトの名無しさん
2021/04/22(木) 12:22:51.68ID:ZUdmCczU 精度、用途、環境
で色々な方法を使うのがベスト
カラツバだけ知っててもほとんど役に立たない
下位レイヤーでもFFT, double-double, ...
など色んな方法があるし
上位レイヤーから下位レイヤーまで全体を考えて最適化しないとダメ
で色々な方法を使うのがベスト
カラツバだけ知っててもほとんど役に立たない
下位レイヤーでもFFT, double-double, ...
など色んな方法があるし
上位レイヤーから下位レイヤーまで全体を考えて最適化しないとダメ
344デフォルトの名無しさん
2021/04/22(木) 12:23:45.87ID:7u43wDLB boostって使える?
あれって、単なるテンプレートで遊んでるだけだろ
そのくせにやたら遅い
正直使い物にならないイメージ
あれって、単なるテンプレートで遊んでるだけだろ
そのくせにやたら遅い
正直使い物にならないイメージ
345デフォルトの名無しさん
2021/04/22(木) 12:31:27.85ID:EICaHt7b >>226でいいじゃん。
これ以上早くしたかったらどうせ環境依存になる
これ以上早くしたかったらどうせ環境依存になる
346デフォルトの名無しさん
2021/04/22(木) 12:43:04.70ID:PcdMDerm347デフォルトの名無しさん
2021/04/22(木) 12:44:09.02ID:b8cAf5Rb >>344
使えるかどうかは置いといて、遅いのは最適化が効いてないとかでは?
使えるかどうかは置いといて、遅いのは最適化が効いてないとかでは?
348デフォルトの名無しさん
2021/04/22(木) 13:00:03.48ID:7u43wDLB >>347
formatなんて激遅
formatなんて激遅
349デフォルトの名無しさん
2021/04/22(木) 13:10:24.41ID:EICaHt7b >>344
boostは標準ライブラリとして採用するための実験場的な側面があるから、C++11以降を使っているならboostに足を向けて寝ちゃだめよ
boostは標準ライブラリとして採用するための実験場的な側面があるから、C++11以降を使っているならboostに足を向けて寝ちゃだめよ
350デフォルトの名無しさん
2021/04/22(木) 17:00:53.68ID:j9DIDz/e stlもコンテナ類からして設計哲学に問題あると思ってる。
それにsize_tがunsignedで、ssize_tがsignedなのも馬鹿。
伝統的なCでは、strlen()などはintでsignedだったのだから、
短く書ける方のsize_tを最初からsignedにすべきだった。
それにsize_tがunsignedで、ssize_tがsignedなのも馬鹿。
伝統的なCでは、strlen()などはintでsignedだったのだから、
短く書ける方のsize_tを最初からsignedにすべきだった。
351デフォルトの名無しさん
2021/04/22(木) 17:06:31.92ID:j9DIDz/e 伝統的なCでは、
int strlen( const char *str );
だったのが、なぜか、64BITにも対応した後は、
size_t strlen( const char *str );
となってしまった。size_tは、必ずunsignedであるとされる。
ならばこのプロトタイプ宣言は、伝統的なCと互換性がない事になる。
しかも、伝統的に int a = sizeof(buf); のように、sizeof() は符号付き int
を返す処理系が多かった。
一方、size_t は、sizeof()演算子の結果の符合なし整数とされる。
これもいろいろな意味で矛盾している。
C++11以降のC++はめちゃくちゃ。
int strlen( const char *str );
だったのが、なぜか、64BITにも対応した後は、
size_t strlen( const char *str );
となってしまった。size_tは、必ずunsignedであるとされる。
ならばこのプロトタイプ宣言は、伝統的なCと互換性がない事になる。
しかも、伝統的に int a = sizeof(buf); のように、sizeof() は符号付き int
を返す処理系が多かった。
一方、size_t は、sizeof()演算子の結果の符合なし整数とされる。
これもいろいろな意味で矛盾している。
C++11以降のC++はめちゃくちゃ。
352デフォルトの名無しさん
2021/04/22(木) 17:08:44.22ID:yNSfYish 何年前のものだか忘れてんじゃね?
まだ単一継承が宗教のような存在だった頃だぞ
これから新しく作るライブラリがああなってたらアホかとも思うが
当時そんな批評できてたやつを憶えているか?
まだ単一継承が宗教のような存在だった頃だぞ
これから新しく作るライブラリがああなってたらアホかとも思うが
当時そんな批評できてたやつを憶えているか?
353デフォルトの名無しさん
2021/04/22(木) 17:25:59.64ID:j9DIDz/e Cの教科書で、
int a;
a = strlen(ptr);
見たいなのはよく見た記憶が有るが、
size_t a;
a = strlen(ptr);
というのは記憶に無い。
昔はsize_tなんて型は本には書いてなかった。
ところがネットだととても昔からstrlen()の戻り値はsize_tであった
と言う事になってしまっていて、全世界的に事実を改竄している。
というか俺の記憶だけが世界の記憶と食い違ってる・・・。
int a;
a = strlen(ptr);
見たいなのはよく見た記憶が有るが、
size_t a;
a = strlen(ptr);
というのは記憶に無い。
昔はsize_tなんて型は本には書いてなかった。
ところがネットだととても昔からstrlen()の戻り値はsize_tであった
と言う事になってしまっていて、全世界的に事実を改竄している。
というか俺の記憶だけが世界の記憶と食い違ってる・・・。
354デフォルトの名無しさん
2021/04/22(木) 17:38:12.90ID:j9DIDz/e 「サイズは本質的に負になることは無いから、符号無しでよい」
なるほど、これには一理ある。しかし、ptr2 - ptr1 は、ptrdiff_t
で符号付きとされる。これは伝統的なCがそうであったから分かる。
しかし良く考えてみると、例えば32BITマシンで、2GBを越えるデータ
を扱う場合、確かにそのサイズは符合つきでは扱えないので符合なしで
良い。ところが、この場合、最後のバイトをptr2、最初のバイトをptr1
でアドレスしているとすれば、ptr2 - ptr1 は、2G を超えた値になる。
おー、となると、ptr2 - ptr1 を ptrdiff_t のような符号付きで解釈すると
負の数となる!!!
おう神よ!!
なるほど、これには一理ある。しかし、ptr2 - ptr1 は、ptrdiff_t
で符号付きとされる。これは伝統的なCがそうであったから分かる。
しかし良く考えてみると、例えば32BITマシンで、2GBを越えるデータ
を扱う場合、確かにそのサイズは符合つきでは扱えないので符合なしで
良い。ところが、この場合、最後のバイトをptr2、最初のバイトをptr1
でアドレスしているとすれば、ptr2 - ptr1 は、2G を超えた値になる。
おー、となると、ptr2 - ptr1 を ptrdiff_t のような符号付きで解釈すると
負の数となる!!!
おう神よ!!
355デフォルトの名無しさん
2021/04/22(木) 17:41:40.96ID:j9DIDz/e >>354
もう少し深く考えて見ると、ptr2 - ptr1 は、どちらが若いアドレスかが
わからない時でも結果を理解するためには、結果は符号付き整数である
ことには合理性がある。つまり、ptr2 < ptr1 なら、負、ptr2 > ptr1 なら
正と。
ところが、32BITマシンで、2GBを越えるデータを扱うと、この解釈では
問題が出る。
結論的には、sizeof()や ptr2 - ptr1 の結果の型に対してどんな場合にでも
上手く行く定義は存在しないようだ。
もう少し深く考えて見ると、ptr2 - ptr1 は、どちらが若いアドレスかが
わからない時でも結果を理解するためには、結果は符号付き整数である
ことには合理性がある。つまり、ptr2 < ptr1 なら、負、ptr2 > ptr1 なら
正と。
ところが、32BITマシンで、2GBを越えるデータを扱うと、この解釈では
問題が出る。
結論的には、sizeof()や ptr2 - ptr1 の結果の型に対してどんな場合にでも
上手く行く定義は存在しないようだ。
356デフォルトの名無しさん
2021/04/22(木) 17:41:51.85ID:yNSfYish K&R1にはsize_tなんか出てこない
strlenの戻り型はintとすら書いておらず
省略時の解釈で暗黙にintとなっている
strlenの戻り型はintとすら書いておらず
省略時の解釈で暗黙にintとなっている
357デフォルトの名無しさん
2021/04/22(木) 22:53:20.32ID:V05yroc1 std::string::size_typeは?
358はちみつ餃子 ◆8X2XSCHEME
2021/04/23(金) 02:30:22.88ID:4SxnyUW7 >>351
「伝統的」っていつの話だよ。
C89 が制定されて以降、 strlen の返却値や sizeof の評価結果の型は size_t だろ。
念のためにちょっと確認してみたら
Turbo C 1.0 なんて 1987 年の日付 (C89 制定前) だが strlen の返却値は size_t になってるぞ。
「伝統的」っていつの話だよ。
C89 が制定されて以降、 strlen の返却値や sizeof の評価結果の型は size_t だろ。
念のためにちょっと確認してみたら
Turbo C 1.0 なんて 1987 年の日付 (C89 制定前) だが strlen の返却値は size_t になってるぞ。
359デフォルトの名無しさん
2021/04/23(金) 02:54:05.85ID:ja7Blzf3 >>358
当時の本でも、
int a;
a = strlen(ptr);
と書いてあったと記憶してるので、指導的立場の人も含めてほとんどすべての人が
unsigned int の戻り値を int の変数に入れていたということだね。
当時の本でも、
int a;
a = strlen(ptr);
と書いてあったと記憶してるので、指導的立場の人も含めてほとんどすべての人が
unsigned int の戻り値を int の変数に入れていたということだね。
360デフォルトの名無しさん
2021/04/23(金) 03:11:41.40ID:ja7Blzf3 https://stackoverflow.com/questions/32985119/strlen-to-int-c-why-cant-i-do-this
↑こんなにC++に詳しそうな人達も、なぜか、符合無しの size_t を
intと比較している:
std::size_t length = s.size();
for (int i = 0; i < length; ++i)
どこかでC/C++の長さは、intであると刷り込まれているようだ。
しかし、35年以上前のTurbo C ですら、unsigned intであったのに。
↑こんなにC++に詳しそうな人達も、なぜか、符合無しの size_t を
intと比較している:
std::size_t length = s.size();
for (int i = 0; i < length; ++i)
どこかでC/C++の長さは、intであると刷り込まれているようだ。
しかし、35年以上前のTurbo C ですら、unsigned intであったのに。
361デフォルトの名無しさん
2021/04/23(金) 03:13:55.04ID:ja7Blzf3 質問者は、
for (int i = 0; int n = (int)strlen(s); i < n, i++)
がエラーになることの理由を聞いているようだが、これは単純に
for文の書き間違いで、少なくとも、
int i, n;
for (i = 0, n = (int)strlen(s); i < n, i++)
と書けばコンパイルは通るはずだ。
for (int i = 0; int n = (int)strlen(s); i < n, i++)
がエラーになることの理由を聞いているようだが、これは単純に
for文の書き間違いで、少なくとも、
int i, n;
for (i = 0, n = (int)strlen(s); i < n, i++)
と書けばコンパイルは通るはずだ。
362デフォルトの名無しさん
2021/04/23(金) 03:25:18.34ID:ja7Blzf3 スマン:
誤: for (i = 0, n = (int)strlen(s); i < n, i++)
正: for (i = 0, n = (int)strlen(s); i < n; i++)
誤: for (i = 0, n = (int)strlen(s); i < n, i++)
正: for (i = 0, n = (int)strlen(s); i < n; i++)
363デフォルトの名無しさん
2021/04/23(金) 05:23:38.34ID:wmFgppeg > どこかでC/C++の長さは、intであると刷り込まれているようだ。
これは違う
double a = 0;
と書いたからって0がdoubleと思っているのと違うようなものだ
これは違う
double a = 0;
と書いたからって0がdoubleと思っているのと違うようなものだ
364デフォルトの名無しさん
2021/04/23(金) 08:03:05.37ID:VR54cMAF365デフォルトの名無しさん
2021/04/23(金) 09:14:12.81ID:W3jbQ1id >>364
現代のガリレオかもしれない
現代のガリレオかもしれない
366デフォルトの名無しさん
2021/04/23(金) 14:58:50.01ID:Lj3XxxY0 >>365
ガリレオの時代にガリレオ以外に地動説を考えてた奴が他にいなかったと思い込む馬鹿。
ガリレオの時代にガリレオ以外に地動説を考えてた奴が他にいなかったと思い込む馬鹿。
367はちみつ餃子 ◆8X2XSCHEME
2021/04/23(金) 19:32:09.65ID:4SxnyUW7 >>360
その場合に int で表現可能な範囲内の値である限り暗黙の型変換で不整合は生じない。
strlen の返却値が size_t なのは、最大でそこまで対応可能ではあるが、
扱うデータの大きさが int の範囲内にあるという「想定」をしてもすぐさま誤りではないし、
int の範囲を超えるほど長大な文字列を想定しなきゃならない機会はそう多くもないだろ。
常識的な想定と言語仕様を混同するべきではない。
その場合に int で表現可能な範囲内の値である限り暗黙の型変換で不整合は生じない。
strlen の返却値が size_t なのは、最大でそこまで対応可能ではあるが、
扱うデータの大きさが int の範囲内にあるという「想定」をしてもすぐさま誤りではないし、
int の範囲を超えるほど長大な文字列を想定しなきゃならない機会はそう多くもないだろ。
常識的な想定と言語仕様を混同するべきではない。
>>365
私も、ある意見について「世界で自分だけ正しい、あとの70億人はすべて間違っている」という実感を持っています
問題はそれを世の中に知らしめす方法ですが、今の私はリアルで打撃につぐ打撃、その上におまけの打撃まで食らう状態で、いわば瀕死の状態‥‥
さてこんなボロボロな私はどうすればいいのでしょうか?
私も、ある意見について「世界で自分だけ正しい、あとの70億人はすべて間違っている」という実感を持っています
問題はそれを世の中に知らしめす方法ですが、今の私はリアルで打撃につぐ打撃、その上におまけの打撃まで食らう状態で、いわば瀕死の状態‥‥
さてこんなボロボロな私はどうすればいいのでしょうか?
369デフォルトの名無しさん
2021/04/23(金) 21:03:11.51ID:/ReE/HFJ その意見とは?
370デフォルトの名無しさん
2021/04/23(金) 22:13:51.83ID:P6csa9Qs >>368
氏ね
氏ね
371蟻人間 ◆T6xkBnTXz7B0
2021/04/23(金) 22:32:09.50ID:/PeODZRO >>368
短期目標と長期目標を立てて、目標に達成したら、自分を褒める。これを繰り返す。
短期目標と長期目標を立てて、目標に達成したら、自分を褒める。これを繰り返す。
372デフォルトの名無しさん
2021/04/23(金) 23:05:33.67ID:E6ocica9 >>368
ビッグバンからやり直せ
ビッグバンからやり直せ
373デフォルトの名無しさん
2021/04/23(金) 23:26:25.47ID:Q3jU6je8374デフォルトの名無しさん
2021/04/23(金) 23:40:13.99ID:dmQwGyWy375デフォルトの名無しさん
2021/04/24(土) 01:05:08.94ID:zTQKHVDv .hファイルと.hppファイルって何が違うんスかね
includeするならincludeしたがわの拡張子でコンパイル方法?が決まるわけで
ヘッダの拡張子の違いとは?
includeするならincludeしたがわの拡張子でコンパイル方法?が決まるわけで
ヘッダの拡張子の違いとは?
376デフォルトの名無しさん
2021/04/24(土) 01:15:37.87ID:h5KFlu4v .hには宣言だけ書いて.hppには実装を書くという使い分けをしている人が多い
宣言と実装を同時に行うときも .hpp
宣言と実装を同時に行うときも .hpp
377デフォルトの名無しさん
2021/04/24(土) 01:20:25.68ID:/oCjni0O STLコンテナに機能を追加したい (たとえば vector の要素の順番を自分のルールで並び替えるメンバ関数を追加したい) ときってどう書くのですか?
この場合はメンバ関数じゃなくてフリー関数として実装した方が良いとしても、メンバ関数を追加する方法を知りたいです
(それとも、STL コンテナの継承が忌避されるのと同じ理由で、こういうのはやらない方が良い話ですか?)
この場合はメンバ関数じゃなくてフリー関数として実装した方が良いとしても、メンバ関数を追加する方法を知りたいです
(それとも、STL コンテナの継承が忌避されるのと同じ理由で、こういうのはやらない方が良い話ですか?)
378デフォルトの名無しさん
2021/04/24(土) 01:32:10.18ID:UuNl8IKh >>377 継承すれば追加できるよ。
379はちみつ餃子 ◆8X2XSCHEME
2021/04/24(土) 01:45:45.85ID:ubeHrzBk380デフォルトの名無しさん
2021/04/24(土) 01:50:57.50ID:zTQKHVDv381デフォルトの名無しさん
2021/04/24(土) 02:37:44.86ID:/oCjni0O382デフォルトの名無しさん
2021/04/24(土) 03:09:41.49ID:CW6Yf84b >>381
STLはソース(ヘッダだけど)を見ると物凄く解読に時間が掛かる書き方になって
いて、正しく現状どうなって実装されているかを理解するのがとても難しいが、
継承するとなるとちゃんと理解出来てないと危険なので継承したがらない人が
多いのだと思う。
STLはソース(ヘッダだけど)を見ると物凄く解読に時間が掛かる書き方になって
いて、正しく現状どうなって実装されているかを理解するのがとても難しいが、
継承するとなるとちゃんと理解出来てないと危険なので継承したがらない人が
多いのだと思う。
383デフォルトの名無しさん
2021/04/24(土) 03:14:32.82ID:CW6Yf84b >>382
あと、テンプレートを普通のクラスの基本クラスにすることは容易だけど、
テンプレートを継承したテンプレートを作るのは、C++をかなり深く理解して無いと
色々と危険かも知れない。
また、ややこしくしてるのは、perfect forwarding や reference collapsing、
右辺値参照、moveセマンティクスが多用されていることに加えて、
余りドキュメント化されて無い解釈の難しい独自関数を使用して書かれている
ことが多いこと。
あと、テンプレートを普通のクラスの基本クラスにすることは容易だけど、
テンプレートを継承したテンプレートを作るのは、C++をかなり深く理解して無いと
色々と危険かも知れない。
また、ややこしくしてるのは、perfect forwarding や reference collapsing、
右辺値参照、moveセマンティクスが多用されていることに加えて、
余りドキュメント化されて無い解釈の難しい独自関数を使用して書かれている
ことが多いこと。
384デフォルトの名無しさん
2021/04/24(土) 03:21:35.70ID:CW6Yf84b >>383
それ以外にも、template引数に「...」があったり、それを使う場所でも「...」
があったりして、それぞれの意味や展開のされ方を正しく理解するのは難しい。
コンパイラがどういう解釈をするのか途方にくれることが有った。まるで
魔法のように見えることすら。結果的な意味は何とか分かっても、コンパイラが
どういう原理や順序で理解したりコンパイルしているのか深く理解できないこと
が多かった。
最新のSTLのソースをちゃんと理解できるまでC++を理解するのは、C++を
本格的に勉強する必要がある。
それ以外にも、template引数に「...」があったり、それを使う場所でも「...」
があったりして、それぞれの意味や展開のされ方を正しく理解するのは難しい。
コンパイラがどういう解釈をするのか途方にくれることが有った。まるで
魔法のように見えることすら。結果的な意味は何とか分かっても、コンパイラが
どういう原理や順序で理解したりコンパイルしているのか深く理解できないこと
が多かった。
最新のSTLのソースをちゃんと理解できるまでC++を理解するのは、C++を
本格的に勉強する必要がある。
385デフォルトの名無しさん
2021/04/24(土) 03:41:23.64ID:CW6Yf84b >>384
古いC++にも「initializer list」という言葉はあったが、C++11以降は
独特の概念が追加され、それに関連したオブジェクトを関数の引数にとったり
できるようになったりして、それの働きを深く理解するのがまた難しい。
また、全体的に lvalue, rvalue に加えて、xvalue, prvalue, glvalueを正確に
理解し、何がどれに属するかを徹底的に理解してなければ、STLのソースコードを
正確に理解することはままなら無い。
僅かでも理解してないことがある状態でSTLのコンテナを独自に継承した
テンプレートを作った場合、思わぬ不具合やメモリー関連の原因が特定しにくい
バグをアプリ開発で忙しい時に遭遇してしまうかも知れない。
古いC++にも「initializer list」という言葉はあったが、C++11以降は
独特の概念が追加され、それに関連したオブジェクトを関数の引数にとったり
できるようになったりして、それの働きを深く理解するのがまた難しい。
また、全体的に lvalue, rvalue に加えて、xvalue, prvalue, glvalueを正確に
理解し、何がどれに属するかを徹底的に理解してなければ、STLのソースコードを
正確に理解することはままなら無い。
僅かでも理解してないことがある状態でSTLのコンテナを独自に継承した
テンプレートを作った場合、思わぬ不具合やメモリー関連の原因が特定しにくい
バグをアプリ開発で忙しい時に遭遇してしまうかも知れない。
386デフォルトの名無しさん
2021/04/24(土) 03:49:16.98ID:CW6Yf84b 間違ってるかも知れないが、
initializer_list<T> は、「list initializer」に関係したテンプレートで、
登場したのはC++11移行なはず。
一方、member initializer listや、class initializer listは、名前が同じだが
全く別の概念なはずで、コンストラクタを関数定義する時に、
: MyBase(0), m_x(x), m_y(y)
のように書く部分。
initilizer list と list initializer はかなり異なった概念なハズだが、
後者に関係したオブジェクトの型は、initializer_list<T>と書くようだ。
間違っていれば指摘して欲しい。
initializer_list<T> は、「list initializer」に関係したテンプレートで、
登場したのはC++11移行なはず。
一方、member initializer listや、class initializer listは、名前が同じだが
全く別の概念なはずで、コンストラクタを関数定義する時に、
: MyBase(0), m_x(x), m_y(y)
のように書く部分。
initilizer list と list initializer はかなり異なった概念なハズだが、
後者に関係したオブジェクトの型は、initializer_list<T>と書くようだ。
間違っていれば指摘して欲しい。
387デフォルトの名無しさん
2021/04/24(土) 03:49:17.13ID:CW6Yf84b 間違ってるかも知れないが、
initializer_list<T> は、「list initializer」に関係したテンプレートで、
登場したのはC++11移行なはず。
一方、member initializer listや、class initializer listは、名前が同じだが
全く別の概念なはずで、コンストラクタを関数定義する時に、
: MyBase(0), m_x(x), m_y(y)
のように書く部分。
initilizer list と list initializer はかなり異なった概念なハズだが、
後者に関係したオブジェクトの型は、initializer_list<T>と書くようだ。
間違っていれば指摘して欲しい。
initializer_list<T> は、「list initializer」に関係したテンプレートで、
登場したのはC++11移行なはず。
一方、member initializer listや、class initializer listは、名前が同じだが
全く別の概念なはずで、コンストラクタを関数定義する時に、
: MyBase(0), m_x(x), m_y(y)
のように書く部分。
initilizer list と list initializer はかなり異なった概念なハズだが、
後者に関係したオブジェクトの型は、initializer_list<T>と書くようだ。
間違っていれば指摘して欲しい。
388デフォルトの名無しさん
2021/04/24(土) 04:06:25.90ID:AUtfiExa クラス A の中で他のクラス B のインスタンスをメンバとして持ちたいとき、B のコンストラクタに引数を渡す方法が初期化リストくらいしかない
つまり後でわかる情報を使って B のコンストラクタを呼ぶ方法がない
B じゃなくて B のポインタを持てば良いって思うかもしれないが、こんなどーでも良いところでポインタの使用を強制する言語仕様ってゴミだろ
もーちょい頑張んなよ、C++クン
つまり後でわかる情報を使って B のコンストラクタを呼ぶ方法がない
B じゃなくて B のポインタを持てば良いって思うかもしれないが、こんなどーでも良いところでポインタの使用を強制する言語仕様ってゴミだろ
もーちょい頑張んなよ、C++クン
389デフォルトの名無しさん
2021/04/24(土) 05:28:21.58ID:n+JXhE4b >>388
バカ?w
バカ?w
390デフォルトの名無しさん
2021/04/24(土) 05:36:02.19ID:RMr7e0df 疑問符はいらないね
391デフォルトの名無しさん
2021/04/24(土) 06:48:46.10ID:glcm53ed using namespace std をヘッダファイル内で使いたいです。なんせ短くなるので
でも、そうすることでリスクを負うというのもわかります
どう折り合いをつけるべきでしょうか
皆さんはどうされていますか
でも、そうすることでリスクを負うというのもわかります
どう折り合いをつけるべきでしょうか
皆さんはどうされていますか
392デフォルトの名無しさん
2021/04/24(土) 06:59:42.53ID:xdmXCppW >>381
メンバ関数追加するだけならまぁ問題は思いつかないけど(スライシングや非仮想のデストラクタはメンバ変数追加が無ければOK
ただ素のvectorからの代入やコピー、ムーブコンストラクトは出来ないので追加で書いてやらないといけない
さらにそのメンバ関数を呼ぶには派生型にキャスト(コピーとか防止のために参照でキャスト)をいちいち書かないといけない
まぁそんな面倒な派生クラス使うくらいならフリー関数にしといた方が楽だよね
そんなこんなで安易な機能追加のための継承(まして継承される前提でないクラスを)ってのは普通避ける
メンバ関数追加するだけならまぁ問題は思いつかないけど(スライシングや非仮想のデストラクタはメンバ変数追加が無ければOK
ただ素のvectorからの代入やコピー、ムーブコンストラクトは出来ないので追加で書いてやらないといけない
さらにそのメンバ関数を呼ぶには派生型にキャスト(コピーとか防止のために参照でキャスト)をいちいち書かないといけない
まぁそんな面倒な派生クラス使うくらいならフリー関数にしといた方が楽だよね
そんなこんなで安易な機能追加のための継承(まして継承される前提でないクラスを)ってのは普通避ける
393デフォルトの名無しさん
2021/04/24(土) 07:00:28.36ID:xdmXCppW >>491
そんなの自分で決断すれば
そんなの自分で決断すれば
394デフォルトの名無しさん
2021/04/24(土) 07:00:46.76ID:xdmXCppW すまん>>391だった
395デフォルトの名無しさん
2021/04/24(土) 07:13:23.58ID:RMr7e0df396デフォルトの名無しさん
2021/04/24(土) 07:14:46.51ID:+S3huMNR コンテナは継承するまでもないほど完成されていること、
コンテナを継承するくらいならコンテナをメンバ変数にもつクラスを定義したほうが機能拡張や仕様変更に対応しやすい
などなどでしょ
コンテナを継承するくらいならコンテナをメンバ変数にもつクラスを定義したほうが機能拡張や仕様変更に対応しやすい
などなどでしょ
397デフォルトの名無しさん
2021/04/24(土) 07:59:47.57ID:glcm53ed >>393-394
でも例えば公開するとかなってくると当然 using namespace std; は問答無用で除くべきですよね?
あと近い話で、マクロってどこに書いたら良いんでしょうか
REPマクロ等を多用するんですが、同じマクロをいろんなヘッダファイルの冒頭に書くのって変ですか?
共通するマクロは、親に該当する utility.hpp みたいなヘッダファイルを作ってそこに書く等するべきですか?
でも例えば公開するとかなってくると当然 using namespace std; は問答無用で除くべきですよね?
あと近い話で、マクロってどこに書いたら良いんでしょうか
REPマクロ等を多用するんですが、同じマクロをいろんなヘッダファイルの冒頭に書くのって変ですか?
共通するマクロは、親に該当する utility.hpp みたいなヘッダファイルを作ってそこに書く等するべきですか?
398デフォルトの名無しさん
2021/04/24(土) 08:07:53.01ID:RMr7e0df399デフォルトの名無しさん
2021/04/24(土) 08:12:30.74ID:fCIZIfYl 同じものはまとめるのがプログラミングの鉄則
400デフォルトの名無しさん
2021/04/24(土) 08:15:10.79ID:V/Qt/+uA 自分はC++17でusingディレクティブでなくusing宣言のパック展開使ってるけど、(using std::cout, std::endl, std::string; とか)
これも好ましくないのかな
これも好ましくないのかな
401デフォルトの名無しさん
2021/04/24(土) 08:17:39.39ID:+S3huMNR using std::* したいスコープを独自の名前空間で囲めば他人に迷惑かけずに済む
マクロは名前空間を超えるので他人に迷惑かけやすい
マクロは名前空間を超えるので他人に迷惑かけやすい
402デフォルトの名無しさん
2021/04/24(土) 08:30:55.95ID:glcm53ed >>401
その理屈だと、公開するプログラムにおいてはマクロはよほどユニークな名前じゃない限り使うべきじゃないってことですか?
その理屈だと、公開するプログラムにおいてはマクロはよほどユニークな名前じゃない限り使うべきじゃないってことですか?
403デフォルトの名無しさん
2021/04/24(土) 08:35:45.72ID:+S3huMNR ヘッダーファイルでマクロを定義するなら名前衝突を警戒すべきであって理屈とかじゃなくてマナー
404デフォルトの名無しさん
2021/04/24(土) 08:40:34.40ID:xdmXCppW405デフォルトの名無しさん
2021/04/24(土) 08:45:45.71ID:fCIZIfYl Windowsのmin,maxとかAppleのcheckとか
考えなしの公開マクロ名は使う側に大迷惑だから慎重にしないといけない
考えなしの公開マクロ名は使う側に大迷惑だから慎重にしないといけない
406デフォルトの名無しさん
2021/04/24(土) 09:19:30.74ID:aNHhbYgZ minとmaxが関数型マクロなのはやさしさ
#include <Windows.h>
#include <stdio.h>
#include <algorithm>
int main() {
int a = 3, b = 4;
//int x = std::max(a, b); // NG! ビルドエラー
int x = (std::max)(a, b); // OK
printf("x=%d\n", x);
}
#include <Windows.h>
#include <stdio.h>
#include <algorithm>
int main() {
int a = 3, b = 4;
//int x = std::max(a, b); // NG! ビルドエラー
int x = (std::max)(a, b); // OK
printf("x=%d\n", x);
}
407デフォルトの名無しさん
2021/04/24(土) 09:57:34.16ID:RMr7e0df #include <windows.h>
#undef max
#undef min
#undef max
#undef min
408デフォルトの名無しさん
2021/04/24(土) 10:18:48.27ID:N1eYD/7j >>307
あなたの粘着力には、ほとほとあきれかえりますね‥‥それって何年前の話?
http://toro.2ch.net/tech/1369350072/171
171 ◆QZaw55cn4c [sage] 投稿日2013/07/11(木) 01:45:29.07
ラプラスは練習中
けれどもどうせ資格試験用だし、むずかしいことははなからやるつもりもないのです、複素関数論なんて一生縁がないとおもう留数とかもう忘れた‥‥
なお、実は 8 年たった今でも私はラプラスは練習中だったりするのです‥‥資格試験の方は諦めていますが
いま詰まっている箇所は以下の定理、証明がわからない、誰か教えて‥‥
https://ja.wikibooks.org/wiki/%E5%88%B6%E5%BE%A1%E3%81%A8%E6%8C%AF%E5%8B%95%E3%81%AE%E6%95%B0%E5%AD%A6/%E7%AC%AC%E4%B8%80%E9%A1%9E/%E9%80%A3%E7%AB%8B%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E8%A7%A3%E6%B3%95/%E9%80%A3%E7%AB%8B%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E8%A7%A3%E6%B3%95/%28%73%49%2D%41%29%5E-1%E3%81%AE%E5%8E%9F%E5%83%8F/%E8%A1%8C%E5%88%97%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%81%A8%E4%BD%99%E5%9B%A0%E5%AD%90
あなたの粘着力には、ほとほとあきれかえりますね‥‥それって何年前の話?
http://toro.2ch.net/tech/1369350072/171
171 ◆QZaw55cn4c [sage] 投稿日2013/07/11(木) 01:45:29.07
ラプラスは練習中
けれどもどうせ資格試験用だし、むずかしいことははなからやるつもりもないのです、複素関数論なんて一生縁がないとおもう留数とかもう忘れた‥‥
なお、実は 8 年たった今でも私はラプラスは練習中だったりするのです‥‥資格試験の方は諦めていますが
いま詰まっている箇所は以下の定理、証明がわからない、誰か教えて‥‥
https://ja.wikibooks.org/wiki/%E5%88%B6%E5%BE%A1%E3%81%A8%E6%8C%AF%E5%8B%95%E3%81%AE%E6%95%B0%E5%AD%A6/%E7%AC%AC%E4%B8%80%E9%A1%9E/%E9%80%A3%E7%AB%8B%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E8%A7%A3%E6%B3%95/%E9%80%A3%E7%AB%8B%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E8%A7%A3%E6%B3%95/%28%73%49%2D%41%29%5E-1%E3%81%AE%E5%8E%9F%E5%83%8F/%E8%A1%8C%E5%88%97%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%81%A8%E4%BD%99%E5%9B%A0%E5%AD%90
410デフォルトの名無しさん
2021/04/24(土) 11:32:30.02ID:plvAJ+CF411デフォルトの名無しさん
2021/04/24(土) 11:40:13.58ID:TN7U0OWK 学歴コンプレックスって醜いよね〜
ところでラプラスって何ですか?
ラプラシアンなら知ってるんですけど
Lhaplusのことですか?
ところでラプラスって何ですか?
ラプラシアンなら知ってるんですけど
Lhaplusのことですか?
412デフォルトの名無しさん
2021/04/24(土) 11:53:07.06ID:zTQKHVDv >>409
そういうのは小さい次元,2x2あたりで計算してみて、大きい次元でも成り立ちそうだなと納得するのが早いかもですな
そういうのは小さい次元,2x2あたりで計算してみて、大きい次元でも成り立ちそうだなと納得するのが早いかもですな
413デフォルトの名無しさん
2021/04/24(土) 12:43:43.67ID:aNHhbYgZ つか人生相談は板違い、
一生虐げられ続ける弱キャラとしての宿命がC++の規格書に書かれているなら話は別だが
一生虐げられ続ける弱キャラとしての宿命がC++の規格書に書かれているなら話は別だが
414デフォルトの名無しさん
2021/04/24(土) 12:44:49.58ID:aNHhbYgZ >>407
天才か!
天才か!
415デフォルトの名無しさん
2021/04/24(土) 12:47:38.37ID:glcm53ed ヘッダオンリーライブラリの体で自作のプログラム配布するときって、全体を namespace でくるむのがマナーなんですかね
普通な名前の関数を定義したりして衝突したら不味いから?
普通な名前の関数を定義したりして衝突したら不味いから?
416デフォルトの名無しさん
2021/04/24(土) 12:56:34.70ID:fCIZIfYl ヘッダオンリーに限った話じゃない
417デフォルトの名無しさん
2021/04/24(土) 13:00:31.18ID:xdmXCppW >>414
それならNOMINMAXでいいのでは
それならNOMINMAXでいいのでは
418デフォルトの名無しさん
2021/04/24(土) 13:05:05.35ID:aNHhbYgZ >>417
もしプリコンパイルヘッダーに
#define NOMINMAX
#include <Windows.h>
と書いてしまった暁には、マクロ版のmin()やmax()を使いたい人は
どうやって生きていくんじゃ……
もしプリコンパイルヘッダーに
#define NOMINMAX
#include <Windows.h>
と書いてしまった暁には、マクロ版のmin()やmax()を使いたい人は
どうやって生きていくんじゃ……
419デフォルトの名無しさん
2021/04/24(土) 13:16:46.63ID:xdmXCppW なるほど(´・ω・`)
420デフォルトの名無しさん
2021/04/24(土) 13:33:18.27ID:5mKZGvgg boost の多次元配列ライブラリ multi_array を使ってるんだが、両辺の shape が違うときに = で代入できないのがストレスなので、引数の shape が違うときには左辺を右辺と同じようにリサイズしてから代入するように = の定義を変えたい
演算子のオーバーロードってテクを使えば良いらしいが、これは諸刃の剣で注意が必要みたいな記事を見て戦々恐々としてる、、、
代入演算子のオーバーロードで最低限気をつけるべきことってどういうものですかね
演算子のオーバーロードってテクを使えば良いらしいが、これは諸刃の剣で注意が必要みたいな記事を見て戦々恐々としてる、、、
代入演算子のオーバーロードで最低限気をつけるべきことってどういうものですかね
421デフォルトの名無しさん
2021/04/24(土) 14:01:29.71ID:F03PJ4BE 気をつけるべきこと
代入演算子を一時的なストレスでオーバーロードしない
代入演算子を一時的なストレスでオーバーロードしない
422デフォルトの名無しさん
2021/04/24(土) 14:04:54.62ID:xdmXCppW 代入はグローバルに書けないはず
メンバとして書くしかない->multi_arrayのヘッダを書き換えるしかない
メンバとして書くしかない->multi_arrayのヘッダを書き換えるしかない
423デフォルトの名無しさん
2021/04/24(土) 14:18:13.19ID:jLd1Bq7I new して確保するわけじゃない、既存の変数のアドレスを格納するだけのポインタって別にスマートポインタじゃなくて生ポで持てば十分だよね?
424デフォルトの名無しさん
2021/04/24(土) 14:33:50.86ID:RMr7e0df 生ポでいい用途を自信を持って判断できず「念のため」スマポ使うやつでも見かけた?
425デフォルトの名無しさん
2021/04/24(土) 14:39:12.20ID:jLd1Bq7I いや自分が不安なだけ
426デフォルトの名無しさん
2021/04/24(土) 15:34:17.33ID:fCIZIfYl 用途次第だけどnullにならない分参照の方がいいかもしれない
もしくはshared_ptrと一緒に使うならweak_ptr
もしくはshared_ptrと一緒に使うならweak_ptr
427デフォルトの名無しさん
2021/04/24(土) 15:39:23.77ID:jLd1Bq7I >>426
後出しですみませんが、vector の各要素へのポインタを vector で持つ事も考えてます
参照の vector は普通には持てないので、その意味でももう生ポインタの vector で良いかって気になっていました
後出しですみませんが、vector の各要素へのポインタを vector で持つ事も考えてます
参照の vector は普通には持てないので、その意味でももう生ポインタの vector で良いかって気になっていました
428デフォルトの名無しさん
2021/04/24(土) 15:46:35.43ID:fCIZIfYl reference_wrapperなら参照vector作れるけど、そこまでしたくないってことならポインタでいいんじゃない
気をつけてな
気をつけてな
429デフォルトの名無しさん
2021/04/24(土) 17:56:54.49ID:F03PJ4BE 考えるべき所がズレてる
既存の変数はポインタを保持してる期間に必ず存在しているか
別スレッドから既存の変数へのアクセスが発生するか
表記方法を考えるのはその後
既存の変数はポインタを保持してる期間に必ず存在しているか
別スレッドから既存の変数へのアクセスが発生するか
表記方法を考えるのはその後
430はちみつ餃子 ◆8X2XSCHEME
2021/04/24(土) 18:25:12.58ID:ubeHrzBk >>423
こういう場面では生ポインタでいいよね? っていう意味?
#include <memory>
int main(void) {
int a;
std::unique_ptr<int> b(&a);
}
むしろ不必要に解放しようとしてワヤになるんで、生ポインタである必要がある。
デリータが何もしないようにすればスマートポインタでも大丈夫ではあるけど、
あえてそうする必要もないし。
>>427
std::vector は要素を追加するなどしたときに再配置が起こる可能性があるから
要素へのポインタ (または参照) を持つのはあまりオススメできない。
(インデックスで持ったほうがいい。)
適切に管理できるならポインタでもそれほど問題でもないんだけど、
質問の雰囲気を見る限り十分な理解があるような感じでもないので……。
こういう場面では生ポインタでいいよね? っていう意味?
#include <memory>
int main(void) {
int a;
std::unique_ptr<int> b(&a);
}
むしろ不必要に解放しようとしてワヤになるんで、生ポインタである必要がある。
デリータが何もしないようにすればスマートポインタでも大丈夫ではあるけど、
あえてそうする必要もないし。
>>427
std::vector は要素を追加するなどしたときに再配置が起こる可能性があるから
要素へのポインタ (または参照) を持つのはあまりオススメできない。
(インデックスで持ったほうがいい。)
適切に管理できるならポインタでもそれほど問題でもないんだけど、
質問の雰囲気を見る限り十分な理解があるような感じでもないので……。
431デフォルトの名無しさん
2021/04/24(土) 18:40:32.67ID:F03PJ4BE vectorの中身なら
要素の参照やポインタ
vectorの参照やポインタと要素のインデックス
イテレター
色々と持ち方があるから
場面場面において適切なのを選ぶ
メモリ管理をしてないのにスマポで保持は無い
要素の参照やポインタ
vectorの参照やポインタと要素のインデックス
イテレター
色々と持ち方があるから
場面場面において適切なのを選ぶ
メモリ管理をしてないのにスマポで保持は無い
432デフォルトの名無しさん
2021/04/24(土) 22:02:18.72ID:aNHhbYgZ433デフォルトの名無しさん
2021/04/25(日) 01:50:20.57ID:Y3JQTvld >>430
> std::vector は要素を追加するなどしたときに再配置が起こる可能性があるから
> 要素へのポインタ (または参照) を持つのはあまりオススメできない。
> (インデックスで持ったほうがいい。)
再配置が起きたとして、ポインタが指してる先が危険にさらされることなんてあるんですか?
> std::vector は要素を追加するなどしたときに再配置が起こる可能性があるから
> 要素へのポインタ (または参照) を持つのはあまりオススメできない。
> (インデックスで持ったほうがいい。)
再配置が起きたとして、ポインタが指してる先が危険にさらされることなんてあるんですか?
434デフォルトの名無しさん
2021/04/25(日) 02:05:45.03ID:NKfmb8Oe newした新しいメモリにコピーして古いのをdeleteしたら古いのを指してるポインタはもう使えんだろ
ほら最近初心者への教え方がおかしい&最初からスマポ押し付けるからこういうのが出てくる・・
ほら最近初心者への教え方がおかしい&最初からスマポ押し付けるからこういうのが出てくる・・
435デフォルトの名無しさん
2021/04/25(日) 02:18:07.61ID:qqNNQCrU いや new や delete はしないって書いてあるよ
よく読んでおじいちゃん
よく読んでおじいちゃん
436デフォルトの名無しさん
2021/04/25(日) 02:22:40.39ID:NKfmb8Oe >>435
本気で言ってんのか?
本気で言ってんのか?
437デフォルトの名無しさん
2021/04/25(日) 03:15:48.16ID:vJWG11Gh 最近のC++が難しく感じる原因は、cppreferenceに頼ってる人が多いから
ではないか。あそこはドキュメントの品質が悪くて混乱の原因になる。
ではないか。あそこはドキュメントの品質が悪くて混乱の原因になる。
438デフォルトの名無しさん
2021/04/25(日) 04:11:52.10ID:vJWG11Gh C++は、代入/コンストラクタがmove系とcopy系で原理的には好き勝手にプログラム
できるので、バグが出た時にプログラムの流れを追うためにはmoveとcopyのどちらが
呼び出されているかプログラマがコードから明確に区別ができないと困るね。
その点、デフォルトmoveで、xxx.clone()としない限りは複製されないRustの
設計思想はそれはそれで便利と言えるかな。
どちらが優れているかは一概には分からないかも知れないけれども、デバッグ
時の追いやすさの観点からすればRust流の方が良いかな。
できるので、バグが出た時にプログラムの流れを追うためにはmoveとcopyのどちらが
呼び出されているかプログラマがコードから明確に区別ができないと困るね。
その点、デフォルトmoveで、xxx.clone()としない限りは複製されないRustの
設計思想はそれはそれで便利と言えるかな。
どちらが優れているかは一概には分からないかも知れないけれども、デバッグ
時の追いやすさの観点からすればRust流の方が良いかな。
439デフォルトの名無しさん
2021/04/25(日) 04:21:43.82ID:vJWG11Gh >>438
C++の場合は、x=std::move(y);と書けば明示的にmove系が呼び出されるので
その場合、混乱は生じないが、右辺が関数の戻り値が構造体型/クラス型の場合、
RVO(Return Value Optimization)が働いたり、右辺が「クラス名(引数列)」
のようなテンポラリオブジェクト作成の場合にはmove系が選択される
という「自動振り分け機能」があり、自分が知らないだけでそれ以外にも
特殊なパターンがまだあるかもしれないことが、不安や予想しづらい
原因になっていると思う。
Rustの場合は、自動化されているかと思いきや、実際には、代入などが
move/copyのどちらになるかに関しては、自動ではなく、
デフォルトmoveで、x.clone()とした場合にのみcopyという明示的に
区別する方式なんだと思う。
C++の場合は、x=std::move(y);と書けば明示的にmove系が呼び出されるので
その場合、混乱は生じないが、右辺が関数の戻り値が構造体型/クラス型の場合、
RVO(Return Value Optimization)が働いたり、右辺が「クラス名(引数列)」
のようなテンポラリオブジェクト作成の場合にはmove系が選択される
という「自動振り分け機能」があり、自分が知らないだけでそれ以外にも
特殊なパターンがまだあるかもしれないことが、不安や予想しづらい
原因になっていると思う。
Rustの場合は、自動化されているかと思いきや、実際には、代入などが
move/copyのどちらになるかに関しては、自動ではなく、
デフォルトmoveで、x.clone()とした場合にのみcopyという明示的に
区別する方式なんだと思う。
440デフォルトの名無しさん
2021/04/25(日) 04:31:24.47ID:C7wl+mxO std::vector<int> v((size_t)3);
printf("&(v[2])=0x%p\n", &(v[2]));
v.resize((size_t)5000);
printf("&(v[2])=0x%p\n", &(v[2]));
↓実行結果(例)
&(v[2])=0x000002376EF91658
&(v[2])=0x000002376EF93A08
printf("&(v[2])=0x%p\n", &(v[2]));
v.resize((size_t)5000);
printf("&(v[2])=0x%p\n", &(v[2]));
↓実行結果(例)
&(v[2])=0x000002376EF91658
&(v[2])=0x000002376EF93A08
441デフォルトの名無しさん
2021/04/25(日) 04:50:08.06ID:2+KF94a+ new,deleteが起きないとかいうトンデモ理論はshared_ptr<T>のstd::vectorと混同した感じ?
442デフォルトの名無しさん
2021/04/25(日) 05:28:38.68ID:oSZrNkR7 数値計算畑の人間だけど、numpy with MKL が C++ より速くてワロス
もうホントにニッチな領域でしか使わなくなっていくな C++
もうホントにニッチな領域でしか使わなくなっていくな C++
>>442
それはシングルユーザーライセンスであっても 500千円からという価格のインテル製コンパイラやライブラリを使うからなのでは?
それはシングルユーザーライセンスであっても 500千円からという価格のインテル製コンパイラやライブラリを使うからなのでは?
444デフォルトの名無しさん
2021/04/25(日) 07:18:12.21ID:U1znDmKO 多次元配列の添字を入れ替える関数を実装したいのですが、任意の次元に対応するものをどう作れば良いのかわかりません。
たとえば v[a][b][c] を v[c][b][a] と入れ替えるのを全ての a, b, c について行ないたいです。
次元が 3 と決まっていれば、整数 a, b, c についてループを回して
v_[c][b][a] = v[a][b][c]
のようにコピーすれば良いのですが、次元が任意だと鉤括弧 [][][] を用いた要素アクセスをどうすれば良いのか分かりません。
不可能ですかね?
その場合、多次元配列を 1 次元で持つことにして、各次元の長さを la, lb, lc,... として、整数 x を 0 から la*lb*lc... -1 まで回して、その都度 x の各桁を取り出して要素をコピーする、みたいなことしかやりようがないですか?
そうなると各桁を取り出すのに割り算とか剰余演算を駆使しないと駄目なのでパフォーマンスが落ちるのが懸念です。
あるいは、3 次元に対応した関数、4 次元に対応した関数、…… といった感じで各次元に特殊化した関数を実装するべきでしょうか?
できれば一般的というか汎用の関数を作りたいのですが。。。
たとえば v[a][b][c] を v[c][b][a] と入れ替えるのを全ての a, b, c について行ないたいです。
次元が 3 と決まっていれば、整数 a, b, c についてループを回して
v_[c][b][a] = v[a][b][c]
のようにコピーすれば良いのですが、次元が任意だと鉤括弧 [][][] を用いた要素アクセスをどうすれば良いのか分かりません。
不可能ですかね?
その場合、多次元配列を 1 次元で持つことにして、各次元の長さを la, lb, lc,... として、整数 x を 0 から la*lb*lc... -1 まで回して、その都度 x の各桁を取り出して要素をコピーする、みたいなことしかやりようがないですか?
そうなると各桁を取り出すのに割り算とか剰余演算を駆使しないと駄目なのでパフォーマンスが落ちるのが懸念です。
あるいは、3 次元に対応した関数、4 次元に対応した関数、…… といった感じで各次元に特殊化した関数を実装するべきでしょうか?
できれば一般的というか汎用の関数を作りたいのですが。。。
445デフォルトの名無しさん
2021/04/25(日) 07:43:25.17ID:C7wl+mxO シングルユーザーライセンスであっても 500千円からという価格のインテル製コンパイラやライブラリ
を使ってもnumpy with MKL が C++ より速いとかこの世は暗黒だな
を使ってもnumpy with MKL が C++ より速いとかこの世は暗黒だな
446デフォルトの名無しさん
2021/04/25(日) 07:46:35.71ID:NKfmb8Oe v[0]やv[i][0]が配列なのか単一の型なのかは判定できるから
enable_ifで分けてオーバーロード(再帰するかしないか)とか出来るはず
enable_ifで分けてオーバーロード(再帰するかしないか)とか出来るはず
447デフォルトの名無しさん
2021/04/25(日) 08:25:03.80ID:1HSCMwQ7448デフォルトの名無しさん
2021/04/25(日) 09:11:43.96ID:/NByfBPS449デフォルトの名無しさん
2021/04/25(日) 10:57:33.64ID:vJWG11Gh >>445
MKLがIntel製で、
「Intel Math Kernel Library (MKL) というのは, Intel 製の高速な数値計算ライブラリ」
だよ。
つまり、Pythonでは、Intel製の高速なライブラリを使っているが、C++では
使って無い場合の速度比較。
MKLがIntel製で、
「Intel Math Kernel Library (MKL) というのは, Intel 製の高速な数値計算ライブラリ」
だよ。
つまり、Pythonでは、Intel製の高速なライブラリを使っているが、C++では
使って無い場合の速度比較。
450デフォルトの名無しさん
2021/04/25(日) 15:10:42.39ID:U1znDmKO >>446
なるほど……
勉強してみますが大変そうですね
外部ライブラリに頼るか迷いますが、多次元配列は非常に基本的な機能だと思ってるので最低限度で取り回しの良いものを自分で持っておきたいという思いがあります……
なるほど……
勉強してみますが大変そうですね
外部ライブラリに頼るか迷いますが、多次元配列は非常に基本的な機能だと思ってるので最低限度で取り回しの良いものを自分で持っておきたいという思いがあります……
451デフォルトの名無しさん
2021/04/25(日) 15:24:49.11ID:o+U9INbB 自分で作った方が融通がきく
452デフォルトの名無しさん
2021/04/25(日) 15:28:33.67ID:o+U9INbB 作るなら[x] [y] [z]の形にしない方が良い
[]の中にベクトルを入れる方が融通がきく
[]の中にベクトルを入れる方が融通がきく
453デフォルトの名無しさん
2021/04/25(日) 16:15:38.64ID:r+TKoBrZ >>452
v[ {x, y, z} ] みたいに要素アクセスするってことですか?
v[ {x, y, z} ] みたいに要素アクセスするってことですか?
454デフォルトの名無しさん
2021/04/25(日) 17:26:07.51ID:Ef2Yns/P MKLが元々c/c++のライブラリってことも知らん輩がおるのか。。
まあ確かにnumpyやってりゃ問題はないが。
まあ確かにnumpyやってりゃ問題はないが。
455デフォルトの名無しさん
2021/04/25(日) 17:43:00.50ID:C7wl+mxO MKLが元々c/c++のライブラリってことは知ってたが
Pythonでシングルユーザーライセンスであっても 500千円からという価格とは思わなかった
、
Pythonでシングルユーザーライセンスであっても 500千円からという価格とは思わなかった
、
456デフォルトの名無しさん
2021/04/25(日) 17:59:18.91ID:Nhz8hzcU457デフォルトの名無しさん
2021/04/25(日) 18:15:22.48ID:S2tV53BX >>454
でも
「numpy with MKL が C++ より速くて」
という言葉からすれば、Pythonの時だけそれを使い、C++の時にはそれを使ってない
としか思えない。
PythonでもC++でも同じMKLを使ってて、Pythonの方がC++より
速いなんて事は有り得ないだろうし。
でも
「numpy with MKL が C++ より速くて」
という言葉からすれば、Pythonの時だけそれを使い、C++の時にはそれを使ってない
としか思えない。
PythonでもC++でも同じMKLを使ってて、Pythonの方がC++より
速いなんて事は有り得ないだろうし。
458デフォルトの名無しさん
2021/04/25(日) 18:56:01.14ID:jEvf9lKr >>456 だれも生ポインタのvectorがだめなんて言ってないから何か勘違いしてそう。
459デフォルトの名無しさん
2021/04/25(日) 19:04:09.59ID:/NByfBPS >>456
ん?ダメなのはvector要素へのポインタだぞ?
ん?ダメなのはvector要素へのポインタだぞ?
460デフォルトの名無しさん
2021/04/25(日) 19:17:31.67ID:2+KF94a+ >>459
だめなのであれば、std::vectorの存在意義を否定することになりかねない。
C互換の配列およびポインタを実現するコンテナはstd::vectorだけ。
危険性を分かったうえで使う、というのが正しいかと。
だめなのであれば、std::vectorの存在意義を否定することになりかねない。
C互換の配列およびポインタを実現するコンテナはstd::vectorだけ。
危険性を分かったうえで使う、というのが正しいかと。
461デフォルトの名無しさん
2021/04/25(日) 19:26:38.89ID:/NByfBPS462デフォルトの名無しさん
2021/04/25(日) 20:19:11.49ID:2+KF94a+ 昔のstd::vectorは先頭アドレスを取得するメンバ関数data()がなかったのでポインタとして使うことに多少の背徳感があった
463デフォルトの名無しさん
2021/04/25(日) 21:16:54.88ID:JRQD9I35 >>453
そう
そう
464デフォルトの名無しさん
2021/04/25(日) 21:20:17.62ID:JRQD9I35465デフォルトの名無しさん
2021/04/25(日) 22:15:04.13ID:yRd8KdQ6 要素の再配置ができない場合や要素のポインタを扱う場合は、多少効率は落ちるがstd::dequeつかえば良いと思う
466デフォルトの名無しさん
2021/04/25(日) 22:40:08.86ID:2+KF94a+ >>465
> vector とは異なる欠点として deque は連続した位置のストレージに全ての要素を持つことを保証していないため、ポインタ演算を介しての安全なアクセスの可能性を排除する。
https://cpprefjp.github.io/reference/deque/deque.html
> vector とは異なる欠点として deque は連続した位置のストレージに全ての要素を持つことを保証していないため、ポインタ演算を介しての安全なアクセスの可能性を排除する。
https://cpprefjp.github.io/reference/deque/deque.html
467デフォルトの名無しさん
2021/04/25(日) 22:44:46.90ID:yRd8KdQ6 >>466
あぁ、連続要素アクセスは確かにだめだなw
あぁ、連続要素アクセスは確かにだめだなw
468デフォルトの名無しさん
2021/04/25(日) 22:50:09.53ID:yRd8KdQ6 でも、連続要素アクセスならポインタなんか使わずに範囲for分なりiteretor使った方が楽だよね
469デフォルトの名無しさん
2021/04/25(日) 22:51:31.52ID:9+aEf3uB なるべくキャッシュに入れたいって率でメモリ連続性を求めてる人たちはたぶんそれだとキツい
470デフォルトの名無しさん
2021/04/25(日) 22:54:28.47ID:2+KF94a+ Win32APIなどOS固有のシステムコールはC言語を前提に作られているので、C++でその恩恵を得たいならメモリ連続性が保証されたコンテナが必要不可欠
471デフォルトの名無しさん
2021/04/25(日) 23:17:48.67ID:yRd8KdQ6 APIがらみだとstd::arrayのheap使用版みたいなのが欲しくなることがあるな
vectorだと初期化が若干面倒なんだよね
vectorだと初期化が若干面倒なんだよね
472デフォルトの名無しさん
2021/04/26(月) 04:02:46.84ID:BvXVNvk7 >>450
ごめんさらっと言ったけど、現在の各次元のインデックスも実行時の数値として渡す必要あるし再帰と相性悪いかも
ただ文法上、次元数に関わらず同じコードで、ってなるとテンプレートと再帰は必須だと思う
けどそこまでしても、君が書いてた一次元で除算と剰余使うのと比べてそんな速くなるとも思えんので無理せず一次元でいいと思うw
ごめんさらっと言ったけど、現在の各次元のインデックスも実行時の数値として渡す必要あるし再帰と相性悪いかも
ただ文法上、次元数に関わらず同じコードで、ってなるとテンプレートと再帰は必須だと思う
けどそこまでしても、君が書いてた一次元で除算と剰余使うのと比べてそんな速くなるとも思えんので無理せず一次元でいいと思うw
473デフォルトの名無しさん
2021/04/26(月) 11:25:57.38ID:BvXVNvk7 https://wandbox.org/permlink/XpJkS3veZNwNOlaQ
気になったのでやってみた、実測(一次元、および要素数決め打ちとの)はめんどいので頼む・・
気になったのでやってみた、実測(一次元、および要素数決め打ちとの)はめんどいので頼む・・
474デフォルトの名無しさん
2021/04/26(月) 14:15:12.52ID:REE9nEfp numpy のAPIを C/C++ から使うのがお薦め
475デフォルトの名無しさん
2021/04/26(月) 14:59:17.98ID:S9wNYjN0476デフォルトの名無しさん
2021/04/26(月) 15:04:19.62ID:S9wNYjN0 >>474
これって、numpy の記法で C++ の配列を操るというわけではなく、Python (numpy) を C++ から操るということですよね?
全ての処理を numpy の機能で行なうことにすれば、全ての計算が事実上 C++ で動くことになるから速いって感じなんですかね
これって、numpy の記法で C++ の配列を操るというわけではなく、Python (numpy) を C++ から操るということですよね?
全ての処理を numpy の機能で行なうことにすれば、全ての計算が事実上 C++ で動くことになるから速いって感じなんですかね
477デフォルトの名無しさん
2021/04/26(月) 16:39:19.86ID:BvXVNvk7 >>475
いや再帰してるのは単にint[I][J][K]をint[J][K]のループ、さらにint[K]のループに(配列の参照で)分解するためにやってるだけ
(そうすればどの階層でもt[i]で書けるから
ただこれ、コンパイル時に要素数も次元数もわかってる固定長の配列でしか使えないんだよね
ポインタを要素数決め打ちで多次元配列の参照にキャストして渡すのは出来るかもしれんけど・・
まぁ要素数が実行時にしか分からなくても使える一次元での計算のが汎用性高いと思う
いや再帰してるのは単にint[I][J][K]をint[J][K]のループ、さらにint[K]のループに(配列の参照で)分解するためにやってるだけ
(そうすればどの階層でもt[i]で書けるから
ただこれ、コンパイル時に要素数も次元数もわかってる固定長の配列でしか使えないんだよね
ポインタを要素数決め打ちで多次元配列の参照にキャストして渡すのは出来るかもしれんけど・・
まぁ要素数が実行時にしか分からなくても使える一次元での計算のが汎用性高いと思う
478デフォルトの名無しさん
2021/04/26(月) 17:57:15.41ID:NyQKOVd9 C++なんだし
多次元コンテナ使おうよ
多次元コンテナ使おうよ
479デフォルトの名無しさん
2021/04/26(月) 18:43:48.56ID:G51Jv2BH 皆さまコロナ禍いかがお過ごしでしょうか
ちょっと質問させてください
特定のクラス内部で自身の型を格納するコンテナを実体として確保し、そのコンテナから入れ子状?のような形で使用しています
私の環境では動くのですが、これを動かしても安全なのでしょうか?
クラス内部には自身の型を確保できないと聞いたことがあります……
問題が起きそうな気配がしなくもない感じがしますが
当方素人です
class hoge{
Int a;
bool b;
vector<hoge> hoge_vec;
};
このクラスを
hoge Tochigi;
Tochigi.hoge_vec[0].a=315;
というように使っているのですが……
ちょっと質問させてください
特定のクラス内部で自身の型を格納するコンテナを実体として確保し、そのコンテナから入れ子状?のような形で使用しています
私の環境では動くのですが、これを動かしても安全なのでしょうか?
クラス内部には自身の型を確保できないと聞いたことがあります……
問題が起きそうな気配がしなくもない感じがしますが
当方素人です
class hoge{
Int a;
bool b;
vector<hoge> hoge_vec;
};
このクラスを
hoge Tochigi;
Tochigi.hoge_vec[0].a=315;
というように使っているのですが……
480デフォルトの名無しさん
2021/04/26(月) 19:13:39.09ID:yzDyA3P+ ビルド通る?
481はちみつ餃子 ◆8X2XSCHEME
2021/04/26(月) 19:25:06.15ID:AdDHfoXQ >>479
問題ない。 クラスは自分自身を内包できないが、
それは自分を内包した自分というものが可能だとすると
大きさが無限になってしまって確定できないからで、
参照やポインタとして持つ分にはそういった問題にならない。
std::vector の実体としてはヒープに確保した配列に要素を入れていく形になるので、
この場合に hoge が hoge を内包しているわけではない。
問題ない。 クラスは自分自身を内包できないが、
それは自分を内包した自分というものが可能だとすると
大きさが無限になってしまって確定できないからで、
参照やポインタとして持つ分にはそういった問題にならない。
std::vector の実体としてはヒープに確保した配列に要素を入れていく形になるので、
この場合に hoge が hoge を内包しているわけではない。
482デフォルトの名無しさん
2021/04/26(月) 19:35:48.39ID:G51Jv2BH >>481
ありがとうございます
アロケーターがコンテナ用の領域を確保してくれるので確保可能と言うことでしょうか?
クラス内部で要素数ゼロのvector領域を確保してメモリを予約してるのかな?
vectorの型がvector分の領域を計算できないから見た感じ不可能だと思って
どういう処理してるのか
ありがとうございます
アロケーターがコンテナ用の領域を確保してくれるので確保可能と言うことでしょうか?
クラス内部で要素数ゼロのvector領域を確保してメモリを予約してるのかな?
vectorの型がvector分の領域を計算できないから見た感じ不可能だと思って
どういう処理してるのか
483はちみつ餃子 ◆8X2XSCHEME
2021/04/26(月) 19:37:27.97ID:AdDHfoXQ >>482
std::vector が適当な大きさの配列へのポインタを持つ構造だと思ったらだいたい正しい。
std::vector が適当な大きさの配列へのポインタを持つ構造だと思ったらだいたい正しい。
484デフォルトの名無しさん
2021/04/26(月) 19:57:41.54ID:G51Jv2BH >>483
その言い方でなんとなくわかった気分になりました
連続で確保できる適当な長さの配列の先頭へのアドレスを確保してるってこと?
自身の大きさは除外してほかのメンバ変数の大きさだけを配列0番目に確保すればいいのかな
その言い方でなんとなくわかった気分になりました
連続で確保できる適当な長さの配列の先頭へのアドレスを確保してるってこと?
自身の大きさは除外してほかのメンバ変数の大きさだけを配列0番目に確保すればいいのかな
485デフォルトの名無しさん
2021/04/26(月) 19:58:27.26ID:G51Jv2BH 前回も餃子さんに答えていただいた記憶
どうもありがとうございました
どうもありがとうございました
486デフォルトの名無しさん
2021/04/26(月) 20:26:32.67ID:ckbrupKp いずれ共有ポインタのvectorを使いたくなるはず
GW期間中に循環参照の罠を思う存分楽しむといい
GW期間中に循環参照の罠を思う存分楽しむといい
487デフォルトの名無しさん
2021/04/26(月) 20:32:09.29ID:1d/LxAg8 やはりノードシステムこそ至高
488デフォルトの名無しさん
2021/04/26(月) 20:51:21.16ID:G51Jv2BH 共有ポインタのvectorって何だろう?
sheared_ptrの事ですか?
sheared_ptrの事ですか?
489デフォルトの名無しさん
2021/04/27(火) 00:45:26.56ID:XHlpaM1W >>478
標準ライブラリは遅いから、使いたくないです
標準ライブラリは遅いから、使いたくないです
490デフォルトの名無しさん
2021/04/27(火) 01:07:31.65ID:rFiajegR 別に標準ライブラリじゃなくて良いんだよ
491デフォルトの名無しさん
2021/04/27(火) 03:14:22.91ID:/IsfP16Y >>478
mdspan?
mdspan?
492デフォルトの名無しさん
2021/04/27(火) 08:10:53.39ID:eX4df2SV 多次元コンテナってもう標準ライブラリ入ってるんですか?
493デフォルトの名無しさん
2021/04/27(火) 08:23:06.09ID:rYx8lJmb なきゃ作れ
494デフォルトの名無しさん
2021/04/27(火) 08:28:06.32ID:jjM1CAyW495デフォルトの名無しさん
2021/04/27(火) 08:34:35.77ID:rYx8lJmb 良いのがあったら使えば良いし
無きゃ作れば良い
っていう感じ
多次元コンテナなんて
使い方によって最適な実装はいくらでも変わるんで
汎用性を追及するのは時間の無駄
無きゃ作れば良い
っていう感じ
多次元コンテナなんて
使い方によって最適な実装はいくらでも変わるんで
汎用性を追及するのは時間の無駄
496デフォルトの名無しさん
2021/04/27(火) 10:24:53.85ID:9qe4V1bo 左辺には置けないものがある、その一覧とか例とかありますかね・・・
497デフォルトの名無しさん
2021/04/27(火) 10:39:34.03ID:zzzFrqtR 例?
整数リテラル
整数リテラル
498デフォルトの名無しさん
2021/04/27(火) 12:29:20.94ID:ul4gccCl 関数
499デフォルトの名無しさん
2021/04/27(火) 12:34:12.25ID:rYx8lJmb const
500デフォルトの名無しさん
2021/04/27(火) 14:47:15.34ID:V9b4VlmB >>496
・定数リテラル、const属性が付くもの、は置けない。
・関数呼び出しの 関数()は、戻り値は、伝統的に右辺値扱いになるので左辺に置くとエラー
になる様になっている。
戻り値は、構造体型(クラス型/union型含む)/整数型/浮動小数点型/ポインタ型/列挙型の場合
を想定した。
・*ptr のようなものは左辺値になるので置ける。
・変数名はconst 修飾されていないなら置ける。
・構造体変数名.データメンバ名 は const 修飾されていないなら置ける。
・「関数名」は置けない。これは関数呼び出しの関数()とは別の話。
・&x は置けない。理由としては右辺値であるから。constでもあるが。
・x + y は、組み込み演算子の場合でも、関数呼び出しに置き換わった場合でも
置けない。後者の場合は、関数の戻り値が置いてあるということになるが右辺値だから。
前者の場合は、右辺値だからだと思う。
・定数リテラル、const属性が付くもの、は置けない。
・関数呼び出しの 関数()は、戻り値は、伝統的に右辺値扱いになるので左辺に置くとエラー
になる様になっている。
戻り値は、構造体型(クラス型/union型含む)/整数型/浮動小数点型/ポインタ型/列挙型の場合
を想定した。
・*ptr のようなものは左辺値になるので置ける。
・変数名はconst 修飾されていないなら置ける。
・構造体変数名.データメンバ名 は const 修飾されていないなら置ける。
・「関数名」は置けない。これは関数呼び出しの関数()とは別の話。
・&x は置けない。理由としては右辺値であるから。constでもあるが。
・x + y は、組み込み演算子の場合でも、関数呼び出しに置き換わった場合でも
置けない。後者の場合は、関数の戻り値が置いてあるということになるが右辺値だから。
前者の場合は、右辺値だからだと思う。
501デフォルトの名無しさん
2021/04/27(火) 14:48:40.00ID:V9b4VlmB >>500
>・構造体変数名.データメンバ名 は const 修飾されていないなら置ける。
これについては、構造体変数名が、右辺値の場合は、
構造体変数名.データメンバ名も右辺値になるため、置けない。
>・構造体変数名.データメンバ名 は const 修飾されていないなら置ける。
これについては、構造体変数名が、右辺値の場合は、
構造体変数名.データメンバ名も右辺値になるため、置けない。
502デフォルトの名無しさん
2021/04/27(火) 15:10:33.44ID:V9b4VlmB [続き]
・(cast)x は置けない。理由は、右辺値になるから。
なので、int i; (char)i = 5; はエラーになる。
そうしたい場合は、*(char *)&i = 5; と書く。
・(cast)x は置けない。理由は、右辺値になるから。
なので、int i; (char)i = 5; はエラーになる。
そうしたい場合は、*(char *)&i = 5; と書く。
503デフォルトの名無しさん
2021/04/27(火) 17:53:11.42ID:x+a+UXmv 配列を要素展開して、可変長引数の関数に渡したいんですけど、どうかけばいいか分かりません
template<typename... Ts>
void g(Ts... ts){}
template<typename T,size_t N>
void f(T (&a)[N])
{
g(a[0],a[1],a[2]/* なんて書くのか*/);
}
template<typename... Ts>
void g(Ts... ts){}
template<typename T,size_t N>
void f(T (&a)[N])
{
g(a[0],a[1],a[2]/* なんて書くのか*/);
}
504デフォルトの名無しさん
2021/04/27(火) 18:30:39.66ID:z5odOJ3h505デフォルトの名無しさん
2021/04/27(火) 19:37:01.40ID:2o2XkKHN >>504
ありがとう出来ました
ありがとう出来ました
506デフォルトの名無しさん
2021/04/27(火) 19:58:19.96ID:1Ls3FsW9 通常クラスのコンストラクタにテンプレート引数がある場合ってどう呼び出したらよいでしょう?
class Test{
public:
template<class T>
Test() {}
};
Test test = Test::Test<int>();
で呼び出せるかと思ったのですが出来ず...
class Test{
public:
template<class T>
Test(T dummy) {}
};
コンストラクタに引数を持たせると、msvcでは一応できました。
Test test(0);
class Test{
public:
template<class T>
Test() {}
};
Test test = Test::Test<int>();
で呼び出せるかと思ったのですが出来ず...
class Test{
public:
template<class T>
Test(T dummy) {}
};
コンストラクタに引数を持たせると、msvcでは一応できました。
Test test(0);
507デフォルトの名無しさん
2021/04/27(火) 20:39:05.42ID:eX4df2SV 代入演算子ってメンバ関数じゃないとだめなんだな
thisを返すから当たり前だが、オーバーロードしたいとき困る
a = b を意味する assign(a, b) を作るしかない?
thisを返すから当たり前だが、オーバーロードしたいとき困る
a = b を意味する assign(a, b) を作るしかない?
508デフォルトの名無しさん
2021/04/27(火) 21:47:32.08ID:rFiajegR 別にthisを返す必要もないけど
509デフォルトの名無しさん
2021/04/28(水) 00:01:05.47ID:pTBAhwEs thisがどうのじゃなくてコピー代入演算子とムーブ代入演算子が特別扱いだから
510デフォルトの名無しさん
2021/04/28(水) 02:07:16.16ID:LEZnE3AK >>506 https://timsong-cpp.github.io/cppwp/n4861/temp.arg.explicit#8
> [Note: Because the explicit template argument list follows the function template name, and because constructor templates ([class.ctor]) are named
> without using a function name ([class.qual]), there is no way to provide an explicit template argument list for these function templates. - end note]
> [Note: Because the explicit template argument list follows the function template name, and because constructor templates ([class.ctor]) are named
> without using a function name ([class.qual]), there is no way to provide an explicit template argument list for these function templates. - end note]
511デフォルトの名無しさん
2021/04/28(水) 03:41:16.44ID:v8E9sca8 unique_ptrって、unique_ptr<T>とuniqu_ptr<T[]>が、1つのテンプレートではなく、
テンプレート自体が別に用意されてるんだよね?
そもそも前者の規則と後者は使う時の記号としても違っていて、前者は、
unique_ptr<int> a = new int;
*a = 5;
と書くのだから、a は、int*、つまり、intへのポインタのように振舞う。
この規則のままであるなら、
unique_ptr<int[]> b = new int[10];
と書いた場合、b は、int[10] へのポインタ、つまり、int (*b)[10] のように
振舞わなければならない。
となると、
b[idx] = value;
とは書けずに、(*b)[idx] = value; と書かねば成らないが、実際にはそうではない。
テンプレート自体が別に用意されてるんだよね?
そもそも前者の規則と後者は使う時の記号としても違っていて、前者は、
unique_ptr<int> a = new int;
*a = 5;
と書くのだから、a は、int*、つまり、intへのポインタのように振舞う。
この規則のままであるなら、
unique_ptr<int[]> b = new int[10];
と書いた場合、b は、int[10] へのポインタ、つまり、int (*b)[10] のように
振舞わなければならない。
となると、
b[idx] = value;
とは書けずに、(*b)[idx] = value; と書かねば成らないが、実際にはそうではない。
512はちみつ餃子 ◆8X2XSCHEME
2021/04/28(水) 05:20:55.28ID:cpOEbmvB >>511
> テンプレート自体が別に用意されてるんだよね?
特殊化で配列の場合は特別に用意されている。
> unique_ptr<int[]> b = new int[10];
> と書いた場合、b は、int[10] へのポインタ、つまり、int (*b)[10] のように
> 振舞わなければならない。
(そのように b を初期化することは出来ない (生ポインタを受け取るコンストラクタには explicit が付いてる) が、意図はわかるのでとりあえずわきに置く。)
new int[10]; という式の型は int* なので、この時点で配列の大きさに関する情報は失われている。
(配列の先頭要素を指す生ポインタではなく) 配列を指す生ポインタのようにスマートポインタを抽象化する意味がない。
どうしてもやりたければ std::array と組み合わせればいいし。
> テンプレート自体が別に用意されてるんだよね?
特殊化で配列の場合は特別に用意されている。
> unique_ptr<int[]> b = new int[10];
> と書いた場合、b は、int[10] へのポインタ、つまり、int (*b)[10] のように
> 振舞わなければならない。
(そのように b を初期化することは出来ない (生ポインタを受け取るコンストラクタには explicit が付いてる) が、意図はわかるのでとりあえずわきに置く。)
new int[10]; という式の型は int* なので、この時点で配列の大きさに関する情報は失われている。
(配列の先頭要素を指す生ポインタではなく) 配列を指す生ポインタのようにスマートポインタを抽象化する意味がない。
どうしてもやりたければ std::array と組み合わせればいいし。
513デフォルトの名無しさん
2021/04/28(水) 12:25:48.23ID:jQpDsyge >>512
すまん。正しい書き方は:
unique_ptr<int[]> b(new int[10]); //(1)
だったようだ。
ちょっと意図が伝わらなかったのか、言いたかったのは、
unique_ptr<T> a; //(2)
の場合、a の型は、T* のようになるのに、
unique_ptr<U[]> b;
の型は、U* のようになるので、数学の様に最初のT=U[]
すまん。正しい書き方は:
unique_ptr<int[]> b(new int[10]); //(1)
だったようだ。
ちょっと意図が伝わらなかったのか、言いたかったのは、
unique_ptr<T> a; //(2)
の場合、a の型は、T* のようになるのに、
unique_ptr<U[]> b;
の型は、U* のようになるので、数学の様に最初のT=U[]
514デフォルトの名無しさん
2021/04/28(水) 12:39:35.77ID:jQpDsyge すまん、まちがって送信してしまった。
>>512
正しい書き方は:
unique_ptr<int[]> b(new int[10]); //(1)
だったようだ。それはともかく、ちょっと意図が伝わらなかったのか、言いたかったのは、
unique_ptr<T> a; //(2)
の場合、a の型は T * であるかのように振舞う(T *a と宣言していたかのように振舞う)のに、
unique_ptr<U[]> b; //(3)
の場合、b の型は U* のように振舞うが、数学の様に(2)にT=U[]を代入してみると、
b の型は本来、T *b とした場合のように振舞うはずなので、数学的には U (*b) [] とした
場合の型になっていなければならないはずなのに、実際には、U *b のようにした場合
の型になっているということで、(3)は数学的には (2)の特殊形とはみなせないということ。
なので、unique_ptr<U[]>のテンプレートは、unique_ptr<T>のテンプレートとは別に人間が
意図的に専用のコードを書いて「特殊化」していることの証拠となるということ。
もちろんそれが「テンプレート特殊化」という仕組みで行われていることは知っているが、
数学的な意味で(2)を一般形とみなした場合の自動的な特殊形にはなってないということ
(だからこそ「テンプレート特殊化」で特殊な場合だけを例外的に特記するのではあるが)。
これは、unique_ptr<T>は、Tが配列型の場合は、Tがその他の場合と比べて
「一般性を失っている」と言える。
一般性を失っていることは、言語として分かりにくくなってしまうと俺は思うんだ。
>>512
正しい書き方は:
unique_ptr<int[]> b(new int[10]); //(1)
だったようだ。それはともかく、ちょっと意図が伝わらなかったのか、言いたかったのは、
unique_ptr<T> a; //(2)
の場合、a の型は T * であるかのように振舞う(T *a と宣言していたかのように振舞う)のに、
unique_ptr<U[]> b; //(3)
の場合、b の型は U* のように振舞うが、数学の様に(2)にT=U[]を代入してみると、
b の型は本来、T *b とした場合のように振舞うはずなので、数学的には U (*b) [] とした
場合の型になっていなければならないはずなのに、実際には、U *b のようにした場合
の型になっているということで、(3)は数学的には (2)の特殊形とはみなせないということ。
なので、unique_ptr<U[]>のテンプレートは、unique_ptr<T>のテンプレートとは別に人間が
意図的に専用のコードを書いて「特殊化」していることの証拠となるということ。
もちろんそれが「テンプレート特殊化」という仕組みで行われていることは知っているが、
数学的な意味で(2)を一般形とみなした場合の自動的な特殊形にはなってないということ
(だからこそ「テンプレート特殊化」で特殊な場合だけを例外的に特記するのではあるが)。
これは、unique_ptr<T>は、Tが配列型の場合は、Tがその他の場合と比べて
「一般性を失っている」と言える。
一般性を失っていることは、言語として分かりにくくなってしまうと俺は思うんだ。
515デフォルトの名無しさん
2021/04/28(水) 12:44:49.64ID:P6pu+tTf 「数学的に」
数学を知らないヤツがよく使う言葉
類義語
「物理的に」
数学を知らないヤツがよく使う言葉
類義語
「物理的に」
516デフォルトの名無しさん
2021/04/28(水) 12:56:00.95ID:VWIud7ZL 規格的にってのも仕事ができない言語厨がよく使ってるw
517デフォルトの名無しさん
2021/04/28(水) 12:57:27.64ID:jQpDsyge >>515
「数学的に」と書いたのは、法則に従った「規則変化」しているということだ。
言語仕様で決まっているとかではなく、記号パターンで「導出」されるというか。
「代入」の概念というか。
優先順位のために、U (*b)[] のような 記号になっているが、これも数学的に
演算子が演算される順序に従って「平坦」に書くと
b --> * --> [] --> U
となる。読み方は、一番左の b の部分以外が右から順に
bの型は「Uの配列へのポインタ」
となる。ちなみに、
T b の場合は、
b --> T
となり、読み方は、
bの型は「T」
となる。
「数学的に」と書いたのは、法則に従った「規則変化」しているということだ。
言語仕様で決まっているとかではなく、記号パターンで「導出」されるというか。
「代入」の概念というか。
優先順位のために、U (*b)[] のような 記号になっているが、これも数学的に
演算子が演算される順序に従って「平坦」に書くと
b --> * --> [] --> U
となる。読み方は、一番左の b の部分以外が右から順に
bの型は「Uの配列へのポインタ」
となる。ちなみに、
T b の場合は、
b --> T
となり、読み方は、
bの型は「T」
となる。
518デフォルトの名無しさん
2021/04/28(水) 12:58:27.74ID:jQpDsyge519デフォルトの名無しさん
2021/04/28(水) 13:01:24.71ID:jQpDsyge >>517
もう少し噛み砕いて書くと、コンパイラ内部では、
U (*b)[];
という宣言は、優先順位に従って、
b --> * --> [] --> U
となり、コンパイラ内部では左から順に
「bは、ポインタ(*)であり、その元の型は、配列([])であり、その元の型は、
U である」
と理解している。
もう少し噛み砕いて書くと、コンパイラ内部では、
U (*b)[];
という宣言は、優先順位に従って、
b --> * --> [] --> U
となり、コンパイラ内部では左から順に
「bは、ポインタ(*)であり、その元の型は、配列([])であり、その元の型は、
U である」
と理解している。
520デフォルトの名無しさん
2021/04/28(水) 13:04:48.90ID:jQpDsyge >>519
b --> * --> [] --> U
は、英語で読むと、左から順に、
「b is a pointer(*) to array([]) to type U.」
と読めて、言葉と記号の順序が一致する。
b --> * --> [] --> U
は、英語で読むと、左から順に、
「b is a pointer(*) to array([]) to type U.」
と読めて、言葉と記号の順序が一致する。
521デフォルトの名無しさん
2021/04/28(水) 14:25:22.22ID:uUyjbKVX void hoge(){
vector<int> a(10);
vector<int*> p(10);
for(int i=0; i<10; i++) p[i] = &a[i];
// play with a and p
}
っていう関数で a とか p に対してやったらやばい操作ってどんなんですかね
vector<int> a(10);
vector<int*> p(10);
for(int i=0; i<10; i++) p[i] = &a[i];
// play with a and p
}
っていう関数で a とか p に対してやったらやばい操作ってどんなんですかね
522デフォルトの名無しさん
2021/04/28(水) 14:41:21.61ID:P6pu+tTf 数学記号に関するIQて何?
523デフォルトの名無しさん
2021/04/28(水) 15:09:55.27ID:pxclvZlf524デフォルトの名無しさん
2021/04/28(水) 15:12:59.93ID:GWxUY3yT すごい
クソゲボゴミ老害の意見
頼まれたことはできない、自分なりに行動しても何も産まない、家族と職場の全員から疎まれてるバカ
天晴
クソゲボゴミ老害の意見
頼まれたことはできない、自分なりに行動しても何も産まない、家族と職場の全員から疎まれてるバカ
天晴
525デフォルトの名無しさん
2021/04/28(水) 15:14:07.47ID:UpJQEntB >>510
ありがとうございます!できないんですね…
ありがとうございます!できないんですね…
526デフォルトの名無しさん
2021/04/28(水) 15:21:22.38ID:aIuZlW8v527デフォルトの名無しさん
2021/04/28(水) 15:26:21.46ID:+7CWSFOZ >>521
pのサイズが変わるような操作はアドレスが変わる可能性があるので全てアウト
pのサイズが変わるような操作はアドレスが変わる可能性があるので全てアウト
528デフォルトの名無しさん
2021/04/28(水) 15:27:17.73ID:+7CWSFOZ >>527
おっと、aのサイズが〜の間違い
おっと、aのサイズが〜の間違い
529デフォルトの名無しさん
2021/04/28(水) 15:51:27.64ID:P5vpmJVI >>515
そうか、禿Stroustrupは数学を知らないのか
そうか、禿Stroustrupは数学を知らないのか
530デフォルトの名無しさん
2021/04/28(水) 15:52:12.82ID:Kf9DoDRw pのサイズ変わるのもまずいよね?
勝手に new/delete されて使用不能になりえるので
勝手に new/delete されて使用不能になりえるので
531デフォルトの名無しさん
2021/04/28(水) 16:03:18.23ID:P6pu+tTf >>529
どこからそういう結論になった?
どこからそういう結論になった?
532デフォルトの名無しさん
2021/04/28(水) 16:04:05.01ID:P6pu+tTf533デフォルトの名無しさん
2021/04/28(水) 16:06:25.57ID:7RK+jwPd >>530
晒しage
晒しage
534デフォルトの名無しさん
2021/04/28(水) 16:18:30.85ID:eLEqCP2l >>530
ダメな例をコードで示してくれ
ダメな例をコードで示してくれ
535デフォルトの名無しさん
2021/04/28(水) 16:28:13.84ID:c0w2coaF 自作クラスや構造体に対して範囲forを使うための条件って、そのクラスや構造体が
・メンバ関数としてbegin()、end()を持つ
・begin()、end()が間接参照演算子、インクリメント演算子、不等価演算子を持つクラスか構造体を返す
で合ってますか?
cpprefjp見てたら一個目の条件しか書いてなかったんですが、二個目の条件要りますよね?
・メンバ関数としてbegin()、end()を持つ
・begin()、end()が間接参照演算子、インクリメント演算子、不等価演算子を持つクラスか構造体を返す
で合ってますか?
cpprefjp見てたら一個目の条件しか書いてなかったんですが、二個目の条件要りますよね?
536はちみつ餃子 ◆8X2XSCHEME
2021/04/28(水) 16:35:30.69ID:cpOEbmvB537デフォルトの名無しさん
2021/04/28(水) 18:23:34.44ID:c0w2coaF もう一個質問させてください
範囲for文ってfor文スコープ外の変数を使えないんですか?
int i;
vector<int> v;
// v を初期化
for(i: v){
...
}
みたいなことをしたいです
範囲for文ってfor文スコープ外の変数を使えないんですか?
int i;
vector<int> v;
// v を初期化
for(i: v){
...
}
みたいなことをしたいです
538デフォルトの名無しさん
2021/04/28(水) 18:36:49.45ID:7AKt1vSf539デフォルトの名無しさん
2021/04/29(木) 06:49:31.89ID:1rAkIDNr >>531
ISBN4-7561-1895のP.500 16.1.1 設計上の制約
ISBN4-7561-1895のP.500 16.1.1 設計上の制約
540デフォルトの名無しさん
2021/04/29(木) 06:50:25.72ID:+7uc9ATw >>538
最近こういうゴミ返しするバカめっちゃ増えたね、このスレ
「intじゃダメ」は「間接参照演算子、インクリメント演算子、不等価演算子を持つクラスか構造体である必要がある」を全く意味しないだろ……
一方で、ではイテレータを返せば良いのかというとそこまで条件が厳しいわけでもなくて、イテレータ「らしき」性質を持ったクラスを返せば良いということなので、この話はそこまで単純じゃない
そういうこと全く分かってないバカが場当たり的な回答をしてるのは甚だ不快ですね
最近こういうゴミ返しするバカめっちゃ増えたね、このスレ
「intじゃダメ」は「間接参照演算子、インクリメント演算子、不等価演算子を持つクラスか構造体である必要がある」を全く意味しないだろ……
一方で、ではイテレータを返せば良いのかというとそこまで条件が厳しいわけでもなくて、イテレータ「らしき」性質を持ったクラスを返せば良いということなので、この話はそこまで単純じゃない
そういうこと全く分かってないバカが場当たり的な回答をしてるのは甚だ不快ですね
541デフォルトの名無しさん
2021/04/29(木) 07:36:35.34ID:fshfa4aU えっっ
Tをイテレータ様のふるまいを示す型として
T begin()だけではダメで
T end()も最低限定義いないといけないんじゃ……
Tをイテレータ様のふるまいを示す型として
T begin()だけではダメで
T end()も最低限定義いないといけないんじゃ……
542デフォルトの名無しさん
2021/04/29(木) 07:50:14.64ID:1rAkIDNr543デフォルトの名無しさん
2021/04/29(木) 08:34:23.25ID:3mmNht9g544デフォルトの名無しさん
2021/04/29(木) 08:51:08.82ID:fshfa4aU 質問者がbegin()とend()の定義の必要性を把握しているのに対して
begin()のみではNGだとレスするのがそんなにドヤるほどのことなのかどうか……
begin()のみではNGだとレスするのがそんなにドヤるほどのことなのかどうか……
545デフォルトの名無しさん
2021/04/29(木) 08:55:45.00ID:3mmNht9g546デフォルトの名無しさん
2021/04/29(木) 09:04:34.25ID:6rdxVFZp >>542
ありがとうございます
v は必ずしも vector<int> ではなく vector<vector<int>> とかで、かついっぱい回るループを想定してるのでできるだけ定数倍を軽くしたいのですが、j を右辺値参照にすればコピーは起きないので相当マシと思って良いですかね
ありがとうございます
v は必ずしも vector<int> ではなく vector<vector<int>> とかで、かついっぱい回るループを想定してるのでできるだけ定数倍を軽くしたいのですが、j を右辺値参照にすればコピーは起きないので相当マシと思って良いですかね
547デフォルトの名無しさん
2021/04/29(木) 09:07:08.51ID:1rAkIDNr 右辺値参照つってもauto&&は左辺値参照も兼ねるぞ
548デフォルトの名無しさん
2021/04/29(木) 09:16:30.33ID:fshfa4aU549デフォルトの名無しさん
2021/04/29(木) 09:22:13.70ID:3mmNht9g 二個目の条件に反してる
550デフォルトの名無しさん
2021/04/29(木) 09:41:24.58ID:fshfa4aU551デフォルトの名無しさん
2021/04/29(木) 10:20:12.63ID:gzXxIopT552デフォルトの名無しさん
2021/04/29(木) 10:26:57.88ID:6rdxVFZp >>547
for()のカッコの中でiをjの参照として定義できたらそれでも良いんですが、そういうことはできるんでしたっけ?
for()のカッコの中でiをjの参照として定義できたらそれでも良いんですが、そういうことはできるんでしたっけ?
553デフォルトの名無しさん
2021/04/29(木) 10:28:45.87ID:6rdxVFZp すみません「定義」というよりは、forのスコープの外にiの宣言はあって、for(ここ)でiがjの参照であることにできたら良いってことです
554デフォルトの名無しさん
2021/04/29(木) 10:29:35.81ID:fshfa4aU555デフォルトの名無しさん
2021/04/29(木) 10:35:45.46ID:gzXxIopT556デフォルトの名無しさん
2021/04/29(木) 11:07:16.11ID:1rAkIDNr557デフォルトの名無しさん
2021/04/29(木) 11:10:24.28ID:6rdxVFZp558デフォルトの名無しさん
2021/04/29(木) 11:52:35.69ID:1rAkIDNr559デフォルトの名無しさん
2021/04/29(木) 12:28:01.48ID:vjsl7cGC ポインタと参照の決定的な違いはそこだね
560デフォルトの名無しさん
2021/04/29(木) 12:46:42.20ID:yUiVUiFp >>541
begin()とend()の型が一致してる必要はない(C++17〜)
begin()とend()の型が一致してる必要はない(C++17〜)
561デフォルトの名無しさん
2021/04/29(木) 13:03:31.68ID:K/HFYMcp https://negation.hatenadiary.org/entry/20111203/1322876171
↑で、簡単に書けば、
class Book {・・・};
class Novel : public Book{・・・};
class Comic : public Book{・・・};
class Shelf { public: std::vector<Book> list; ・・・ };
Shelf g_shelf;
int main(void) {
Novel n = Novel("Hoshio wo tugumono");
Comic c = Comic("Kimetsu no Yaiba");
Shelf s = Shelf();
g_shelft.list.push_back(n);
g_shelft.list.push_back(c);
}
のようになっているところがあるけど、
vector<Book>って、Bookの実体の動的配列で、
Book a[100];
とにら様なものだと思うんだけど、NovelやComicのクラスのバイトサイズが
Bookを越えたら、入りきれないと思うんだけど、これで合ってる?
合ってるとしたら、どういう仕組み?
もしかして、vector<Book>って、
Book *p[100];
みたいな配列なの?
↑で、簡単に書けば、
class Book {・・・};
class Novel : public Book{・・・};
class Comic : public Book{・・・};
class Shelf { public: std::vector<Book> list; ・・・ };
Shelf g_shelf;
int main(void) {
Novel n = Novel("Hoshio wo tugumono");
Comic c = Comic("Kimetsu no Yaiba");
Shelf s = Shelf();
g_shelft.list.push_back(n);
g_shelft.list.push_back(c);
}
のようになっているところがあるけど、
vector<Book>って、Bookの実体の動的配列で、
Book a[100];
とにら様なものだと思うんだけど、NovelやComicのクラスのバイトサイズが
Bookを越えたら、入りきれないと思うんだけど、これで合ってる?
合ってるとしたら、どういう仕組み?
もしかして、vector<Book>って、
Book *p[100];
みたいな配列なの?
562デフォルトの名無しさん
2021/04/29(木) 13:05:10.26ID:K/HFYMcp >>561
すまん。間違った。正しくはこう :
int main(void) {
Novel n = Novel("Hoshio wo tugumono");
Comic c = Comic("Kimetsu no Yaiba");
Shelf s = Shelf();
s.list.push_back(n);
s.list.push_back(c);
}
すまん。間違った。正しくはこう :
int main(void) {
Novel n = Novel("Hoshio wo tugumono");
Comic c = Comic("Kimetsu no Yaiba");
Shelf s = Shelf();
s.list.push_back(n);
s.list.push_back(c);
}
563デフォルトの名無しさん
2021/04/29(木) 13:10:29.61ID:yUiVUiFp564デフォルトの名無しさん
2021/04/29(木) 13:10:34.24ID:K/HFYMcp https://stackoverflow.com/questions/16126578/vectors-and-polymorphism-in-c
↑によれば、やっぱり、>>561 や >>562 のようなやり方は間違いで、
std::vector<T> の T は、Bookではなく、shared_ptr<Book> のようなものを入れるべきで、
以下の様になっている。だから、>>561 や >>562 は間違いだよね?
class Instruction {・・・};
class Add: public Instruction{・・・};
typedef shared_ptr<Instruction> PInstruction;
vector<PInstruction> v;
v.emplace_back(make_shared<Add>());
↑によれば、やっぱり、>>561 や >>562 のようなやり方は間違いで、
std::vector<T> の T は、Bookではなく、shared_ptr<Book> のようなものを入れるべきで、
以下の様になっている。だから、>>561 や >>562 は間違いだよね?
class Instruction {・・・};
class Add: public Instruction{・・・};
typedef shared_ptr<Instruction> PInstruction;
vector<PInstruction> v;
v.emplace_back(make_shared<Add>());
565デフォルトの名無しさん
2021/04/29(木) 13:16:01.96ID:yUiVUiFp566デフォルトの名無しさん
2021/04/29(木) 13:19:09.72ID:K/HFYMcp >>563
なるほど、では、正しい書き方としては、たとえば、こうかな:
class Book {・・・};
class Novel : public Book{・・・};
class Comic : public Book{・・・};
typedef shared_ptr<Book> PBOOK;
class Shelf : public std::vector<PBOOK> {・・・};
Shelf g_shelf;
int main(void) {
std::shared_ptr<Novel> n = make_shared<Novel>("Hoshio wo tugumono");
std::shared_ptr<Comic> c = make_shared<Comic>("Kimetsu no Yaiba");
g_shelf.push_back(n);
g_shelf.push_back(c);
}
なるほど、では、正しい書き方としては、たとえば、こうかな:
class Book {・・・};
class Novel : public Book{・・・};
class Comic : public Book{・・・};
typedef shared_ptr<Book> PBOOK;
class Shelf : public std::vector<PBOOK> {・・・};
Shelf g_shelf;
int main(void) {
std::shared_ptr<Novel> n = make_shared<Novel>("Hoshio wo tugumono");
std::shared_ptr<Comic> c = make_shared<Comic>("Kimetsu no Yaiba");
g_shelf.push_back(n);
g_shelf.push_back(c);
}
567はちみつ餃子 ◆8X2XSCHEME
2021/04/29(木) 18:07:20.75ID:x0Vd7BP9 パブリック継承している型のオブジェクトが基底クラスへ暗黙に型変換されるのは抑止する方法がないんだよな。
568デフォルトの名無しさん
2021/04/30(金) 01:30:09.20ID:7VhEvZ/Q569デフォルトの名無しさん
2021/04/30(金) 08:17:30.86ID:tsrXe0Ut それは別に問題ない
func(Animal a)だとやばい
func(Animal a)だとやばい
570デフォルトの名無しさん
2021/04/30(金) 09:32:28.19ID:W8up1rh0 funcがAnimalの情報しか使わないんなら別にいいんだけどね
単にポリモーフィズムにはポインタか参照が必要ってだけ
単にポリモーフィズムにはポインタか参照が必要ってだけ
571デフォルトの名無しさん
2021/04/30(金) 09:52:57.56ID:dyTEtgxA shared_ptr<T>もいけるでしょ
スタックを使った60バイト近いメモリーコピーが発生するから最適ではないけど
スタックを使った60バイト近いメモリーコピーが発生するから最適ではないけど
572デフォルトの名無しさん
2021/04/30(金) 10:40:50.56ID:7VhEvZ/Q >>569
class Animal {・・・};
class Dog : publoic Animal {・・・};
std::vector<Animal> g_list;
void func( Animal &a )
{
g_list.push_back(a);
}
int main()
{
Dog d;
func(d); // コンパイルエラーにはならないのに、スライシングが発生。駄目な例。
return 0;
}
class Animal {・・・};
class Dog : publoic Animal {・・・};
std::vector<Animal> g_list;
void func( Animal &a )
{
g_list.push_back(a);
}
int main()
{
Dog d;
func(d); // コンパイルエラーにはならないのに、スライシングが発生。駄目な例。
return 0;
}
573デフォルトの名無しさん
2021/04/30(金) 11:02:34.65ID:Qm/DlA0m >>572
スライシングが発生してるのは g_list.push_back(a) であって、 func( Animal &a ) は関係ないでしょ。
スライシングが発生してるのは g_list.push_back(a) であって、 func( Animal &a ) は関係ないでしょ。
574デフォルトの名無しさん
2021/04/30(金) 11:21:35.01ID:qs5VuYRE なんで範囲for文ってBOOST_FOREACHを完全に置き換えれるようにしなかったの?
>>537,542はそれで解決するし、逆順のループとかもできるのに
>>537,542はそれで解決するし、逆順のループとかもできるのに
575デフォルトの名無しさん
2021/04/30(金) 11:34:29.27ID:vL4rFdIy ポリモーフィズム前提の時は、コピーコンストラクタはdeleteするのが良いのかね
576デフォルトの名無しさん
2021/04/30(金) 11:43:26.05ID:qs5VuYRE577デフォルトの名無しさん
2021/04/30(金) 11:48:46.39ID:7VhEvZ/Q >>573
この場合、スライシングが発生しても問題ない、という観点もあるかも。
この場合、スライシングが発生しても問題ない、という観点もあるかも。
578デフォルトの名無しさん
2021/04/30(金) 12:01:43.38ID:W8up1rh0 >>575
そしたら派生クラス同士でコピー出来んやろ、コピー禁止にしたいのでなければ書くべき(で派生のコピーコンストラクタで基底のコピーコンストラクタを初期化リストから呼ぶ
必ず派生させて使うのが前提ならコンストラクタをprotectedにするとかその辺のテクニックは大昔から色々出てる
そしたら派生クラス同士でコピー出来んやろ、コピー禁止にしたいのでなければ書くべき(で派生のコピーコンストラクタで基底のコピーコンストラクタを初期化リストから呼ぶ
必ず派生させて使うのが前提ならコンストラクタをprotectedにするとかその辺のテクニックは大昔から色々出てる
579デフォルトの名無しさん
2021/04/30(金) 12:18:33.85ID:7VhEvZ/Q スライシングが起きるとき、基本クラス部分だけをコピーすることになるが、
その際、仮想テーブルへのポインタが継承クラス用のままだと、コピー後の
操作が危険になる可能性があるが、もし、仮想テーブルへのポインタを
基本クラス用に変えてしてしまえば、コピー後の動作は完全に基本クラス的に
なってしまうけれど、その反面、メンバー関数を呼び出しても特にメモリーの
破壊などは起きないはず。
そのようにしてしまえばスライシングが起きても問題ないような気が。
その際、仮想テーブルへのポインタが継承クラス用のままだと、コピー後の
操作が危険になる可能性があるが、もし、仮想テーブルへのポインタを
基本クラス用に変えてしてしまえば、コピー後の動作は完全に基本クラス的に
なってしまうけれど、その反面、メンバー関数を呼び出しても特にメモリーの
破壊などは起きないはず。
そのようにしてしまえばスライシングが起きても問題ないような気が。
580デフォルトの名無しさん
2021/04/30(金) 12:31:22.41ID:W8up1rh0 >>578て書いたけど実際ポリモーフィズム目的の継承ツリーだとコピー禁止にしてること多いな・・
どうせポインタ(orスマポ)で管理するから確かにコピー禁止のが無難かもね
どうせポインタ(orスマポ)で管理するから確かにコピー禁止のが無難かもね
581デフォルトの名無しさん
2021/04/30(金) 12:38:12.34ID:5yvxXz0O >>570
それぞれのコピコンをプログラマが自由に記述できる以上、例えAnimalの情報しか参照しないとしても問題が起こることはあるんじゃね?
例えば、DogのコピコンはAnimal::cuterThanCat変数を強制的にtrueに書き換えてるかもしれない
それぞれのコピコンをプログラマが自由に記述できる以上、例えAnimalの情報しか参照しないとしても問題が起こることはあるんじゃね?
例えば、DogのコピコンはAnimal::cuterThanCat変数を強制的にtrueに書き換えてるかもしれない
582デフォルトの名無しさん
2021/04/30(金) 12:51:39.69ID:W8up1rh0583デフォルトの名無しさん
2021/04/30(金) 14:49:19.98ID:qs5VuYRE 誰かBOOST_FOREACHを自作クラスに使う条件教えてください
584はちみつ餃子 ◆8X2XSCHEME
2021/04/30(金) 16:01:39.38ID:Efpw+/b3585デフォルトの名無しさん
2021/04/30(金) 20:24:33.87ID:QZYh0z4M >>579
>スライシングが起きるとき、基本クラス部分だけをコピーすることになるが、
>その際、仮想テーブルへのポインタが継承クラス用のままだと、コピー後の
>操作が危険
そんな恐ろしいことが!
と思って試したが、少なくともデフォルトのコピコンは仮想関数テーブルへのポインタを
コピー先の型に合わせて付け替えてくれるらしい
↓そうでなけれはfunc_with_ref(Animal a)の中でa2.get()がDogの値でなくAnimalの値を返す説明がつかない
https://ideone.com/eJMsYG
規格でどうなっているかは知らん
>スライシングが起きるとき、基本クラス部分だけをコピーすることになるが、
>その際、仮想テーブルへのポインタが継承クラス用のままだと、コピー後の
>操作が危険
そんな恐ろしいことが!
と思って試したが、少なくともデフォルトのコピコンは仮想関数テーブルへのポインタを
コピー先の型に合わせて付け替えてくれるらしい
↓そうでなけれはfunc_with_ref(Animal a)の中でa2.get()がDogの値でなくAnimalの値を返す説明がつかない
https://ideone.com/eJMsYG
規格でどうなっているかは知らん
586デフォルトの名無しさん
2021/04/30(金) 20:25:50.19ID:QZYh0z4M 訂正orz、
誤: そうでなけれはfunc_with_ref(Animal a)の中で
正: そうでなけれはfunc_with_copy(Animal a)の中で
誤: そうでなけれはfunc_with_ref(Animal a)の中で
正: そうでなけれはfunc_with_copy(Animal a)の中で
587デフォルトの名無しさん
2021/05/01(土) 07:00:40.64ID:2eVlBBCY ていうかよく考えたらAnimalのコピコンは
Animalのコンストラクタでもあるのだから>>585の挙動は当然かorz
Animalのコンストラクタでもあるのだから>>585の挙動は当然かorz
588デフォルトの名無しさん
2021/05/01(土) 09:21:42.94ID:C4kuj/yW コピコン
589デフォルトの名無しさん
2021/05/01(土) 09:28:33.15ID:18idEqJd コピコン
たまに見る
頭悪そう
たまに見る
頭悪そう
590デフォルトの名無しさん
2021/05/01(土) 10:19:04.33ID:tHuso9oJ でもコピーコンストラクターって長いよね
591デフォルトの名無しさん
2021/05/01(土) 10:26:47.50ID:2eVlBBCY コンストラクタはコンストラ
コピーコンストラクタはコピコン
デストラクタはデストラ
アルゴリズムはアルゴ
と略すのが効率的
コピーコンストラクタはコピコン
デストラクタはデストラ
アルゴリズムはアルゴ
と略すのが効率的
592デフォルトの名無しさん
2021/05/01(土) 10:31:05.38ID:Jen9oEOj 取引先がそんな言葉を使ってきたら
今後の契約を考え直すかも
少なくとも評価はマイナス
取引先とそんな細かい内容を話す打合せも無いだろうけど
今後の契約を考え直すかも
少なくとも評価はマイナス
取引先とそんな細かい内容を話す打合せも無いだろうけど
593デフォルトの名無しさん
2021/05/01(土) 11:21:44.35ID:fSkONWKY >>591
気持ち悪い略語だな
気持ち悪い略語だな
594デフォルトの名無しさん
2021/05/01(土) 12:04:39.12ID:zZz/KCNF デストラw
595デフォルトの名無しさん
2021/05/01(土) 12:14:30.82ID:yzll/vyD ctor,dtorは一般的な略語?
596デフォルトの名無しさん
2021/05/01(土) 12:14:41.90ID:toT74GP1 機能を引き継ぐために継承して、インスタンス化して使うために移譲もしたい
継承も移譲もするのってありですか?
継承も移譲もするのってありですか?
597デフォルトの名無しさん
2021/05/01(土) 12:45:03.96ID:toT74GP1 わかんねえ
継承が相応しくない場合が山程あるのはわかった
継承が相応しくないが一部機能を引き継ぎたいときは、コードのコピペをするべきなのか?
継承が相応しくない場合が山程あるのはわかった
継承が相応しくないが一部機能を引き継ぎたいときは、コードのコピペをするべきなのか?
598デフォルトの名無しさん
2021/05/01(土) 12:53:12.87ID:C4kuj/yW 独立させる
599デフォルトの名無しさん
2021/05/01(土) 13:13:50.17ID:toT74GP1 >>598
より小さいクラスか構造体として切り出すということ?
より小さいクラスか構造体として切り出すということ?
600デフォルトの名無しさん
2021/05/01(土) 13:18:13.99ID:T/ErWrJ0 private継承じゃダメなの?
601デフォルトの名無しさん
2021/05/01(土) 13:52:11.96ID:toT74GP1 >>600
ダメってことはもちろんなくて、そう実装することにすればそう実装するだけだが、継承である以上は依存関係が生じるし、相応しくない場合もあるなあと思うだけ
ダメってことはもちろんなくて、そう実装することにすればそう実装するだけだが、継承である以上は依存関係が生じるし、相応しくない場合もあるなあと思うだけ
602デフォルトの名無しさん
2021/05/01(土) 13:54:03.05ID:TBkH44Fh intをとるかcharを取るかで振る舞いを変えるオーバーロード関数って作れるんですか?
その場合、受け取ったのがintかcharかプログラムはどうやって見分けるのですか?
その場合、受け取ったのがintかcharかプログラムはどうやって見分けるのですか?
603デフォルトの名無しさん
2021/05/01(土) 14:19:20.97ID:I2agxka5 オーバーロードという単語を知っておきながら、何故できないと思ったんだ
604デフォルトの名無しさん
2021/05/01(土) 16:00:09.42ID:qPtffzbe >>602
関数シグネチャってもんがあるわけよ。
リンカは関数名ではなくこのシグネチャでリンクする。
引数の型が変わるとこのシグネチャが変わるので、
プログラムというかコンパイラはそれを間違えることはない。
関数シグネチャってもんがあるわけよ。
リンカは関数名ではなくこのシグネチャでリンクする。
引数の型が変わるとこのシグネチャが変わるので、
プログラムというかコンパイラはそれを間違えることはない。
605デフォルトの名無しさん
2021/05/01(土) 16:28:04.60ID:18idEqJd intとcharは使う側が間違いやすいから
間違えたら問題がある場合は名前を変えよう
間違えたら問題がある場合は名前を変えよう
606デフォルトの名無しさん
2021/05/01(土) 16:37:35.74ID:JkRHvcmQ607デフォルトの名無しさん
2021/05/01(土) 17:09:26.40ID:1WejqaZh >>602
C++で関数呼び出しを書いた場合、どの関数が呼び出されるかは
Best Matching Algorithm で選ばれているので実引数が charの場合は、
同じ場所の仮引数がcharである関数を優先的に選ぼうとする。
もし、同じ場所の仮引数がcharであるものが見つからなければ、
同じ場所の仮引数が int であるものを探して、見つかればそれを選択する。
このとき、実引数と仮引数の型の「距離」のような概念があり、
距離が近いものが選ばれる。複数の引数が有る場合で、二つの引数で
距離が近い関数がどっちもどっちになる場合には、「曖昧」であると、
され、エラーになる。
>その場合、受け取ったのがintかcharかプログラムはどうやって見分けるのですか?
ここであなたの言っている「見分ける」という意味が分かりにくいが、
オーバーロードされた関数は、C++レベルでは同じ名前に見えていてもが
アセンブラレベルでは別の関数名になっていて、別の関数として扱われていて、
別の関数が呼び出されているから「見分ける」以前問題になっている。
C++で関数呼び出しを書いた場合、どの関数が呼び出されるかは
Best Matching Algorithm で選ばれているので実引数が charの場合は、
同じ場所の仮引数がcharである関数を優先的に選ぼうとする。
もし、同じ場所の仮引数がcharであるものが見つからなければ、
同じ場所の仮引数が int であるものを探して、見つかればそれを選択する。
このとき、実引数と仮引数の型の「距離」のような概念があり、
距離が近いものが選ばれる。複数の引数が有る場合で、二つの引数で
距離が近い関数がどっちもどっちになる場合には、「曖昧」であると、
され、エラーになる。
>その場合、受け取ったのがintかcharかプログラムはどうやって見分けるのですか?
ここであなたの言っている「見分ける」という意味が分かりにくいが、
オーバーロードされた関数は、C++レベルでは同じ名前に見えていてもが
アセンブラレベルでは別の関数名になっていて、別の関数として扱われていて、
別の関数が呼び出されているから「見分ける」以前問題になっている。
>>591
コピコン以外は使わないです‥‥
コピコン以外は使わないです‥‥
609デフォルトの名無しさん
2021/05/01(土) 17:24:45.49ID:CnJDnM0a610デフォルトの名無しさん
2021/05/01(土) 17:29:02.27ID:1WejqaZh >>605
それは、実際そうだと思う。
char idx = xxx;
func( 'a' + idx );
と書いた場合、func(int)とfunc(char)のどちらが呼び出されるのかを
事前に予想するのは非常に難しい。
なぜなら、伝統的にCでは、char + char は、それぞれが int に昇格
されてから、int + int になって、結果も int になるとされていたから。
それは、実際そうだと思う。
char idx = xxx;
func( 'a' + idx );
と書いた場合、func(int)とfunc(char)のどちらが呼び出されるのかを
事前に予想するのは非常に難しい。
なぜなら、伝統的にCでは、char + char は、それぞれが int に昇格
されてから、int + int になって、結果も int になるとされていたから。
611デフォルトの名無しさん
2021/05/01(土) 18:00:18.46ID:1WejqaZh ファイル出力で、1バイト出力と4バイト出力の違いは、単に人間が見るための
stdout出力とは訳が違って、後からファイルを入力する時にその部分のバイト数の違い
が大きな意味を持つので、オーバーロードの仕組みだけでコンパイラに自動振り分け
させるのは、分かりにくいバグを入れてしまう可能性がある。
なので、やはり、出力するのは1バイトなのか4バイトなのかを、明確に関数名で
区別できるようにした方が望ましいと思われる。
stdout出力とは訳が違って、後からファイルを入力する時にその部分のバイト数の違い
が大きな意味を持つので、オーバーロードの仕組みだけでコンパイラに自動振り分け
させるのは、分かりにくいバグを入れてしまう可能性がある。
なので、やはり、出力するのは1バイトなのか4バイトなのかを、明確に関数名で
区別できるようにした方が望ましいと思われる。
612デフォルトの名無しさん
2021/05/01(土) 18:45:41.91ID:JkRHvcmQ613デフォルトの名無しさん
2021/05/01(土) 18:55:40.94ID:u3yKRN8V > 589 名前:デフォルトの名無しさん[sage] 投稿日:2021/05/01(土) 09:28:33.15 ID:18idEqJd [1/2]
> コピコン
> たまに見る
> 頭悪そう
>>595に何も言えねえ
頭悪そうw
> コピコン
> たまに見る
> 頭悪そう
>>595に何も言えねえ
頭悪そうw
614デフォルトの名無しさん
2021/05/01(土) 19:59:37.32ID:tHuso9oJ マングリング、ってなんかイヤらしいよね
615デフォルトの名無しさん
2021/05/01(土) 20:50:21.52ID:TTMGRbh+ >>612
?h@@YAXH@Z みたいなのを関数名って言うのは違和感しかないわ
> そもそもリンカはマングリングされているのかされていないのかも関知しないし。
それを言うならリンカは関数かどうかすら関知してない
?h@@YAXH@Z みたいなのを関数名って言うのは違和感しかないわ
> そもそもリンカはマングリングされているのかされていないのかも関知しないし。
それを言うならリンカは関数かどうかすら関知してない
616デフォルトの名無しさん
2021/05/01(土) 21:00:22.23ID:CnJDnM0a >>612
むちゃくちゃだなぁ。わざわざ用語をごっちゃにして何がうれしいの?
シンボルが関数を指すのか変数その他を指すのかもリンカは関知しないんじゃないの?
たとえば ld のマニュアルに function name なんて一度も出てこないし。
https://linux.die.net/man/1/ld
> ld combines a number of object and archive files, relocates their data and ties up symbol references. ...
むちゃくちゃだなぁ。わざわざ用語をごっちゃにして何がうれしいの?
シンボルが関数を指すのか変数その他を指すのかもリンカは関知しないんじゃないの?
たとえば ld のマニュアルに function name なんて一度も出てこないし。
https://linux.die.net/man/1/ld
> ld combines a number of object and archive files, relocates their data and ties up symbol references. ...
617デフォルトの名無しさん
2021/05/01(土) 21:25:44.91ID:18idEqJd 私は「関数名」派
C++のコンパイラは元々はC++からCに翻訳してたわけだし
C++のコンパイラは元々はC++からCに翻訳してたわけだし
618デフォルトの名無しさん
2021/05/01(土) 21:27:05.03ID:18idEqJd まあどっちでもいいけど
619デフォルトの名無しさん
2021/05/02(日) 00:16:29.81ID:r2Ed4Ypi620デフォルトの名無しさん
2021/05/02(日) 01:13:49.22ID:hoeVnODB オーバーライドの意味も知らない子は無理して回答しなくていいよ
621デフォルトの名無しさん
2021/05/02(日) 01:21:37.53ID:AyQRjFej C++初心者はクラス継承の学習にこだわりテンプレートの学習が後回しになるので、テンプレートが最適解になることが多いと悟るのが遅くなる
622デフォルトの名無しさん
2021/05/02(日) 01:23:19.71ID:liMkj8Q9 オーバルライトは新しいからね。
623デフォルトの名無しさん
2021/05/02(日) 01:39:37.43ID:uIjrwEP9624デフォルトの名無しさん
2021/05/02(日) 01:40:39.79ID:uIjrwEP9625デフォルトの名無しさん
2021/05/02(日) 06:37:18.08ID:pZrwNqHn626デフォルトの名無しさん
2021/05/02(日) 08:57:49.73ID:rpBXKN7W 基底クラスBで定義された int foo(double x) が派生クラスD1、D2でオーバーライドされた場合、
同じ「foo」という関数名に対して
Bのクラス名が入ったマングルされたシンボル _$F_B__foo_INT_1_DBL
D1のクラス名が入ったマングルされたシンボル _$F_D1_foo_INT_1_DBL
D2のクラス名が入ったマングルされたシンボル _$F_D2__foo_INT_1_DBL
みたいな3種類のシンボルがリンカに渡されることになり(マングリング規則は適当
、{ オーバーライドされた関数名 }と{ オーバーライドされたシンボル }の
1対1対応は崩れるのだから
関数名≠関数のシンボル
を示す例としてオーバーライドはオーバーロードと同じく妥当であることは変わりが無い
、と思うが知らん
同じ「foo」という関数名に対して
Bのクラス名が入ったマングルされたシンボル _$F_B__foo_INT_1_DBL
D1のクラス名が入ったマングルされたシンボル _$F_D1_foo_INT_1_DBL
D2のクラス名が入ったマングルされたシンボル _$F_D2__foo_INT_1_DBL
みたいな3種類のシンボルがリンカに渡されることになり(マングリング規則は適当
、{ オーバーライドされた関数名 }と{ オーバーライドされたシンボル }の
1対1対応は崩れるのだから
関数名≠関数のシンボル
を示す例としてオーバーライドはオーバーロードと同じく妥当であることは変わりが無い
、と思うが知らん
627デフォルトの名無しさん
2021/05/02(日) 09:20:39.13ID:aspEWHUD628デフォルトの名無しさん
2021/05/02(日) 10:53:26.72ID:r2Ed4Ypi629デフォルトの名無しさん
2021/05/02(日) 12:10:24.45ID:tUw9C2ed このクソ議論見ても関数オーバーロードの仕様は失敗してるってのがよくわかる。
630デフォルトの名無しさん
2021/05/02(日) 12:12:19.26ID:KNEFHTDE …などと意味不明の供述をしており、
631デフォルトの名無しさん
2021/05/02(日) 12:47:09.45ID:72ULtZJb 悪い子: この仕様はクソだ!
普通の子: この仕様は〇〇だから良くないね
良い子: この仕様は〇〇だから良くないね、△△とすれば良いのに
普通の子: この仕様は〇〇だから良くないね
良い子: この仕様は〇〇だから良くないね、△△とすれば良いのに
632デフォルトの名無しさん
2021/05/02(日) 13:06:19.55ID:hoeVnODB >>626
それは単に別のクラスで同じ名前のメンバ関数はシンボルが違うってだけの話だろ
オーバーライドは全く関係ない
そもそもオーバーライドの関数選択はvtblの仕事だからリンカは何も関知してない
オーバーロードと並べて語る意味が全くわからない
それは単に別のクラスで同じ名前のメンバ関数はシンボルが違うってだけの話だろ
オーバーライドは全く関係ない
そもそもオーバーライドの関数選択はvtblの仕事だからリンカは何も関知してない
オーバーロードと並べて語る意味が全くわからない
633デフォルトの名無しさん
2021/05/02(日) 13:16:03.71ID:B3yuABqk ダンバインよりビルバインのほうが好き
634デフォルトの名無しさん
2021/05/02(日) 13:18:20.36ID:rpBXKN7W (話に付いてこれてない香具師が居るな
635デフォルトの名無しさん
2021/05/02(日) 13:20:32.85ID:rpBXKN7W >そもそもオーバーライドの関数選択はvtblの仕事だからリンカは何も関知してない
では聞くがvtblに乗っける関数へのポインタのアドレスは誰が最終的に決めるんじゃ
ちな1つのクラスのメソッドの定義が必ずしも同一の翻訳単位内とは限らないから、
相対インデックス指定の出番は無い=コンパイル時解決は不可能
では聞くがvtblに乗っける関数へのポインタのアドレスは誰が最終的に決めるんじゃ
ちな1つのクラスのメソッドの定義が必ずしも同一の翻訳単位内とは限らないから、
相対インデックス指定の出番は無い=コンパイル時解決は不可能
636デフォルトの名無しさん
2021/05/02(日) 13:26:01.49ID:hoeVnODB >では聞くがvtblに乗っける関数へのポインタのアドレスは誰が最終的に決めるんじゃ
実行時に実行バイナリが決めるに決まってるだろ
リンカがリンク時に静的に決めるとでも思ってるの?すげえなそのリンカ
実行時に実行バイナリが決めるに決まってるだろ
リンカがリンク時に静的に決めるとでも思ってるの?すげえなそのリンカ
637デフォルトの名無しさん
2021/05/02(日) 13:27:21.13ID:anCj3LhS >>633
それはオーラロード
それはオーラロード
638デフォルトの名無しさん
2021/05/02(日) 13:46:56.51ID:KNEFHTDE よく知らんけど、多くの場合vtblを作るのはコンパイル時であって、リンク時でも実行時でもないのでは?
639デフォルトの名無しさん
2021/05/02(日) 13:50:36.00ID:h6as2k/z >>635
vtbl内のアドレスを最終的に決めるのはリンカなんだろうけど、それは
「オーバーライドの関数選択はvtblの仕事だからリンカは何も関知してない」と両立するので
反論ぽく挙げてる意味がわからない。
vtbl内のアドレスを最終的に決めるのはリンカなんだろうけど、それは
「オーバーライドの関数選択はvtblの仕事だからリンカは何も関知してない」と両立するので
反論ぽく挙げてる意味がわからない。
640デフォルトの名無しさん
2021/05/02(日) 13:51:49.77ID:AyQRjFej ビルバインはもっと禍々しいデザインになる予定だったが、競合アニメだったマクロス・シリーズの影響で変形ギミックが追加され色も派手になった
641デフォルトの名無しさん
2021/05/02(日) 13:53:08.50ID:B3yuABqk >>637
分かってくれてありがとうw
分かってくれてありがとうw
642デフォルトの名無しさん
2021/05/02(日) 13:53:56.96ID:01FRJ74M おまいら中身のある会話しろよ
ひまなの?
ひまなの?
643はちみつ餃子 ◆8X2XSCHEME
2021/05/02(日) 15:30:38.46ID:VAfyzxcR せやで。
644デフォルトの名無しさん
2021/05/02(日) 18:29:19.65ID:r2Ed4Ypi >>627
実際にプログラムを改修したりする場面では継承とテンプレートどちらでやるか
悩むってのはよくある話。
テンプレートだと元のクラスをいじらなくちゃならないからためらいがち。
その点継承だと元のコードいじらなくて(あるいは最小限の修正で)済むからな。
継承してテンプレートってのもなしじゃないがw継承するくらいなら、テンプレートまで
やんないw
実際にプログラムを改修したりする場面では継承とテンプレートどちらでやるか
悩むってのはよくある話。
テンプレートだと元のクラスをいじらなくちゃならないからためらいがち。
その点継承だと元のコードいじらなくて(あるいは最小限の修正で)済むからな。
継承してテンプレートってのもなしじゃないがw継承するくらいなら、テンプレートまで
やんないw
645デフォルトの名無しさん
2021/05/02(日) 18:44:15.42ID:01FRJ74M 継承とテンプレートって全然違うけど
悩む場面が想定出来ない
悩む場面が想定出来ない
646デフォルトの名無しさん
2021/05/02(日) 19:07:17.74ID:ZwmHpnzp もう継承はしなければしないだけ偉いっていう気持ちになって久しい
つーかOOPに飽きてるというか見限ってる
C++を使ってるのは単に自由度が高くてパフォーマンスが良いから
つーかOOPに飽きてるというか見限ってる
C++を使ってるのは単に自由度が高くてパフォーマンスが良いから
647デフォルトの名無しさん
2021/05/02(日) 19:55:42.70ID:BSsO48AF OOPに飽きてる俺すげー
ってかw
ってかw
648デフォルトの名無しさん
2021/05/02(日) 20:02:15.30ID:aspEWHUD 普段どの程度の規模のどういうコード書いててその結論に至ったかで評価が変わるな
649デフォルトの名無しさん
2021/05/02(日) 20:06:12.37ID:aspEWHUD >>644
改修にテンプレートがどう役立つのか想像つきにくいけど
そのコードが前提としてる特定の型以外でも受け入れられるようにするとか?
(それで継承とテンプレートどっちが優れてるという話にはならない気がするが
改修にテンプレートがどう役立つのか想像つきにくいけど
そのコードが前提としてる特定の型以外でも受け入れられるようにするとか?
(それで継承とテンプレートどっちが優れてるという話にはならない気がするが
650デフォルトの名無しさん
2021/05/02(日) 22:27:50.57ID:r2Ed4Ypi651デフォルトの名無しさん
2021/05/02(日) 22:42:08.00ID:Uu9e0iPh 低レイヤーコードの置き換えを前提にモデル化できるってのがオブジェクト指向の一つの売りだが
まああんまりそこの置き換えってしないわけだわな。
言うほど有効な場面は多くないってのはそれはそう。
素直に関数かけやって場面のが圧倒的に多い。
まああんまりそこの置き換えってしないわけだわな。
言うほど有効な場面は多くないってのはそれはそう。
素直に関数かけやって場面のが圧倒的に多い。
652デフォルトの名無しさん
2021/05/03(月) 03:06:36.21ID:cgOLnSCp653デフォルトの名無しさん
2021/05/03(月) 03:09:53.91ID:cgOLnSCp >>651
>低レイヤーコードの置き換えを前提にモデル化できるってのがオブジェクト指向の一つの売りだが
>まああんまりそこの置き換えってしないわけだわな。
>言うほど有効な場面は多くないってのはそれはそう。
めちゃくちゃ低レイヤーな部分の書き換えは余り起こらないけれど、
クラスは階層的に継承して行くから、中間的な部分は結構修正が入る。
また、やはり仮想関数(ポリモーフィズム)の作法は便利。
>低レイヤーコードの置き換えを前提にモデル化できるってのがオブジェクト指向の一つの売りだが
>まああんまりそこの置き換えってしないわけだわな。
>言うほど有効な場面は多くないってのはそれはそう。
めちゃくちゃ低レイヤーな部分の書き換えは余り起こらないけれど、
クラスは階層的に継承して行くから、中間的な部分は結構修正が入る。
また、やはり仮想関数(ポリモーフィズム)の作法は便利。
654デフォルトの名無しさん
2021/05/03(月) 03:15:32.93ID:cgOLnSCp >>653
というか、基本クラスの Animal 的なクラスの修正はそんなに頻繁には入らなくて、
Dog, Cat, Lion, Bird, Fish みたいな部分の修正がプログラミングの主戦場になる。
例えばゲーム作りの場合、Animalクラスの中にwalk(), eat(), battle(), sleep(),
jump(), set_velocity(), set_position() などを仮想関数で用意しておいて、
Animalを継承したDog, Cat, Lion, Bird, fishみたいなクラスがそれぞれ
どのように歩いて、どのように食べて、どのように戦って、どのように寝て、
どのようにジャンプするかをプログラムするというのはとても便利。
クラスや継承、仮想関数の概念が無ければその様に便利にプログラムする
ことは簡単にはいかない。
というか、基本クラスの Animal 的なクラスの修正はそんなに頻繁には入らなくて、
Dog, Cat, Lion, Bird, Fish みたいな部分の修正がプログラミングの主戦場になる。
例えばゲーム作りの場合、Animalクラスの中にwalk(), eat(), battle(), sleep(),
jump(), set_velocity(), set_position() などを仮想関数で用意しておいて、
Animalを継承したDog, Cat, Lion, Bird, fishみたいなクラスがそれぞれ
どのように歩いて、どのように食べて、どのように戦って、どのように寝て、
どのようにジャンプするかをプログラムするというのはとても便利。
クラスや継承、仮想関数の概念が無ければその様に便利にプログラムする
ことは簡単にはいかない。
655デフォルトの名無しさん
2021/05/03(月) 03:37:22.90ID:ndSqMpB2 シンプルにポリモをやるための継承はいいんだけど
それ以外をやるための道具として流用し始めると途端におかしくなるって経験上思ってる
それ以外をやるための道具として流用し始めると途端におかしくなるって経験上思ってる
656デフォルトの名無しさん
2021/05/03(月) 06:47:59.32ID:J4qyGfu1657デフォルトの名無しさん
2021/05/03(月) 06:56:42.03ID:O7+GYvY4 派生関係がなくても関数名を一致(つまりオーバーロード)させるだけで動いてくれるテンプレートのほうが楽なことが多い。
実際、最近C++に追加されている機能は大部分が派生関係のないテンプレートクラス。
一方、派生して使うiostream系クラスは機能追加される気配がまるでない。
実際、最近C++に追加されている機能は大部分が派生関係のないテンプレートクラス。
一方、派生して使うiostream系クラスは機能追加される気配がまるでない。
658デフォルトの名無しさん
2021/05/03(月) 09:29:12.51ID:1Xubdwf1659デフォルトの名無しさん
2021/05/03(月) 10:18:11.42ID:/gB1psu8 皆様おはようございます
ちょっと質問させてください
テンプレートクラスを宣言定義する時に、ヘッダーに定義を書かないとエラーを吐いてしまいます
テンプレートクラスのヘッダーファイルを、他のヘッダーファイルにインクルードして使う場合、なるべくテンプレートクラスのヘッダーに必要なファイルをインクルードをしたくないので、テンプレートクラスをヘッダーソースに分けて記述できれば嬉しいのですが……
//テンプレートのヘッダー
template<class T>
class Hoge{
public:
Hoge();
};
//テンプレートのソース
template<class T>
Hoge<class T>::Hoge(){
cout<<“hego !”<<endl;
}
//テンプレートを使うクラス(別なヘッダーファイル)
class UseHoge{
public:
UseHoge(){
Hoge hoge;
}
};
これをメインで記述すると未解決の外部エラーになってしまいます
テンプレートをUseHogeのヘッダーソースに分けて記述すればエラーは出ないのですが出来るなら独立させたいです……
何かいい方法がありますでしょうか?
ちょっと質問させてください
テンプレートクラスを宣言定義する時に、ヘッダーに定義を書かないとエラーを吐いてしまいます
テンプレートクラスのヘッダーファイルを、他のヘッダーファイルにインクルードして使う場合、なるべくテンプレートクラスのヘッダーに必要なファイルをインクルードをしたくないので、テンプレートクラスをヘッダーソースに分けて記述できれば嬉しいのですが……
//テンプレートのヘッダー
template<class T>
class Hoge{
public:
Hoge();
};
//テンプレートのソース
template<class T>
Hoge<class T>::Hoge(){
cout<<“hego !”<<endl;
}
//テンプレートを使うクラス(別なヘッダーファイル)
class UseHoge{
public:
UseHoge(){
Hoge hoge;
}
};
これをメインで記述すると未解決の外部エラーになってしまいます
テンプレートをUseHogeのヘッダーソースに分けて記述すればエラーは出ないのですが出来るなら独立させたいです……
何かいい方法がありますでしょうか?
660デフォルトの名無しさん
2021/05/03(月) 10:27:08.26ID:jyja/vBX Hogeを使う型で具体化する話?
661デフォルトの名無しさん
2021/05/03(月) 10:32:39.67ID:1Xubdwf1 基本的にテンプレートの実装をソースに書くことは出来ないよ
与える型を決め打ち(明示的実体化)すれば出来るけど、当然汎用性は大幅に下がる
与える型を決め打ち(明示的実体化)すれば出来るけど、当然汎用性は大幅に下がる
662デフォルトの名無しさん
2021/05/03(月) 11:41:17.40ID:/gB1psu8 Hogeをvectorやunique_ptrの様に、インクルードすればどこでも使えるようなテンプレートクラスにしたいのですが、そういう場合はHogeの定義もヘッダーに記述して、そのヘッダーを適宜インクルードするような形になるんでしょうか?
663デフォルトの名無しさん
2021/05/03(月) 11:46:53.45ID:ndSqMpB2 それを出来るようにするためのexportという機能が昔の標準規格に定義されてたんだが
難しすぎてほとんどのコンパイラが実装できなかったので消えた
難しすぎてほとんどのコンパイラが実装できなかったので消えた
664デフォルトの名無しさん
2021/05/03(月) 11:56:42.04ID:1Xubdwf1665デフォルトの名無しさん
2021/05/03(月) 11:59:02.11ID:/gB1psu8 >>663
ありがとうございます
難しい感じなんですね
インクルードでコンパイル時間が余分にかかるかも……と思っていたのですがそれが一番近い方法なのでしょうね
コンパイル時点でTの大きさがわからないから明治化しない限りはリンカ?でのエラーになるのでしょうか?
ありがとうございます
難しい感じなんですね
インクルードでコンパイル時間が余分にかかるかも……と思っていたのですがそれが一番近い方法なのでしょうね
コンパイル時点でTの大きさがわからないから明治化しない限りはリンカ?でのエラーになるのでしょうか?
666デフォルトの名無しさん
2021/05/03(月) 12:02:09.68ID:/gB1psu8667デフォルトの名無しさん
2021/05/03(月) 13:46:09.28ID:aV7aDLTY >>656
ただ、MFCを見ても分かるように、例えば、左ボタンをクリックした時には、
が OnLButtonDown()というメンバー関数が呼び出される様になっていて、
それは、CWndで基礎が定義されていて、CWndを継承したクラスも同じ関数名で
同じイベントを処理する様になっている。
これを純粋なCだけで書くのは分かりにくいだろう。
ただ、MFCを見ても分かるように、例えば、左ボタンをクリックした時には、
が OnLButtonDown()というメンバー関数が呼び出される様になっていて、
それは、CWndで基礎が定義されていて、CWndを継承したクラスも同じ関数名で
同じイベントを処理する様になっている。
これを純粋なCだけで書くのは分かりにくいだろう。
668デフォルトの名無しさん
2021/05/03(月) 14:09:33.89ID:aV7aDLTY >>667
ちなみに、MFCはちょっと複雑になっていて、C++本来のポリモーフィズムは、
設計上は virtual 属性をつけた仮想関数で実装するようになっているのだが、
CWnd::OnLButtonDown()CWnd::OnChar()やCWnd::OnKeyDown()などに
関しては、非仮想関数で実装されていて、メッセージマップなる独自の仕組みで
MFCのフレームワークが独自に継承クラスのものを呼び出すような仕組みに
なっていて、「Message Routing」などと呼ばれている。
MFCでC++本来の仮想関数で実装されているものとしては、CWnd::PreTranslateMessage()
がある。
なお、C++を使っていて便利なところは、
void CMyWnd::OnLButtonDown()
{
if (条件) {
(処理); // CMyWnd の独自の処理
}
else {
CWnd::OnLButtonDown(); // 継承する前のデフォルトの処理
}
}
のように、条件によって継承する前のデフォルトの処理も分かり易く呼び出せるところ。
これをplain な Cで統一した書き方で分かり易く書くのは不可能。
ちなみに、MFCはちょっと複雑になっていて、C++本来のポリモーフィズムは、
設計上は virtual 属性をつけた仮想関数で実装するようになっているのだが、
CWnd::OnLButtonDown()CWnd::OnChar()やCWnd::OnKeyDown()などに
関しては、非仮想関数で実装されていて、メッセージマップなる独自の仕組みで
MFCのフレームワークが独自に継承クラスのものを呼び出すような仕組みに
なっていて、「Message Routing」などと呼ばれている。
MFCでC++本来の仮想関数で実装されているものとしては、CWnd::PreTranslateMessage()
がある。
なお、C++を使っていて便利なところは、
void CMyWnd::OnLButtonDown()
{
if (条件) {
(処理); // CMyWnd の独自の処理
}
else {
CWnd::OnLButtonDown(); // 継承する前のデフォルトの処理
}
}
のように、条件によって継承する前のデフォルトの処理も分かり易く呼び出せるところ。
これをplain な Cで統一した書き方で分かり易く書くのは不可能。
669デフォルトの名無しさん
2021/05/03(月) 14:22:00.89ID:O7+GYvY4 WTLって知ってる?
MFCとほぼ同じ機能を派生クラスではなくテンプレートクラスで実現しているんだが、ソースが綺麗
MFCとほぼ同じ機能を派生クラスではなくテンプレートクラスで実現しているんだが、ソースが綺麗
670デフォルトの名無しさん
2021/05/03(月) 14:28:53.28ID:1Xubdwf1 何言ってんだWTLも継承使ってるしユーザーもWTLから継承するだろうがアホか
典型的なポリモーフィズムではないけど、それがそのままデメリットにもなってる(ウインドウのインスタンス管理をまとめられない
典型的なポリモーフィズムではないけど、それがそのままデメリットにもなってる(ウインドウのインスタンス管理をまとめられない
671デフォルトの名無しさん
2021/05/03(月) 14:39:14.18ID:O7+GYvY4 継承といっても1世代だけじゃん
多重継承も使ってるから感じにくいけど
多重継承も使ってるから感じにくいけど
672デフォルトの名無しさん
2021/05/03(月) 15:08:41.96ID:1Xubdwf1 本気で言ってんのか?
673デフォルトの名無しさん
2021/05/03(月) 15:17:14.89ID:O7+GYvY4 テンプレートは実体化された時に存在の有無を判定されるので、最低限のオーバーロードで済ませる
674はちみつ餃子 ◆8X2XSCHEME
2021/05/03(月) 16:27:31.54ID:9b5rlct5 そういえばどこかの超人プログラマ集団がいる組織では必要になったら設計を気にせずどんどん
機能を増やしていって、どうにもならなくなったらさっさと捨てて作り直す文化があるというのを聞いたことが有る。
剛腕があれば綺麗な設計なんて必要がないし、無能ならば綺麗な設計は出来ない。
つまり大体の場合にあんまり綺麗な設計にならないってことになる。
それでもなんとかするしか仕方ない。
機能を増やしていって、どうにもならなくなったらさっさと捨てて作り直す文化があるというのを聞いたことが有る。
剛腕があれば綺麗な設計なんて必要がないし、無能ならば綺麗な設計は出来ない。
つまり大体の場合にあんまり綺麗な設計にならないってことになる。
それでもなんとかするしか仕方ない。
675デフォルトの名無しさん
2021/05/03(月) 17:27:36.73ID:aV7aDLTY >>674
完全に捨てるというのは、多分、大きなプロジェクトでは無理で
リファクタリングするんだと思われるが、その際に基本クラスの
設計や継承の仕方が変わる、ということなんだと思われる。
例えば Windowsエミュレータの Wineや、clangのソースなどを
いくらソースが汚くなったからといって完全に書き換えるというのは
どんなに超人豪腕プログラマ集団でも効率が良い方法とは
思えない。なぜなら、例えばWineのソースは150MB位あるから。
完全に捨てるというのは、多分、大きなプロジェクトでは無理で
リファクタリングするんだと思われるが、その際に基本クラスの
設計や継承の仕方が変わる、ということなんだと思われる。
例えば Windowsエミュレータの Wineや、clangのソースなどを
いくらソースが汚くなったからといって完全に書き換えるというのは
どんなに超人豪腕プログラマ集団でも効率が良い方法とは
思えない。なぜなら、例えばWineのソースは150MB位あるから。
676デフォルトの名無しさん
2021/05/03(月) 17:32:03.66ID:aV7aDLTY >>674
アジャイル開発の説明によれば、ソースがきれいかどうかについては、
そのコードに機能追加や改良を続けられているのであれば、それで良し、
と考えるとあった。本当に問題が有るのは改良を続けられなくなってきた
時で、その時はその時で、リファクタリングしてソースを整理すると良いと。
常に綺麗にし続けるというのは努力はしても良いが、基本的には不可能に
近くて、むしろ、ソースを綺麗にすることが目的になってしまっては、
無駄に時間が掛かりすぎてかえって時間のロスになってしまうことがあるから。
アジャイル開発の説明によれば、ソースがきれいかどうかについては、
そのコードに機能追加や改良を続けられているのであれば、それで良し、
と考えるとあった。本当に問題が有るのは改良を続けられなくなってきた
時で、その時はその時で、リファクタリングしてソースを整理すると良いと。
常に綺麗にし続けるというのは努力はしても良いが、基本的には不可能に
近くて、むしろ、ソースを綺麗にすることが目的になってしまっては、
無駄に時間が掛かりすぎてかえって時間のロスになってしまうことがあるから。
677デフォルトの名無しさん
2021/05/03(月) 18:09:40.04ID:5dhwfeG+ ソースコードからひたすらcall treeを書きまくって独立した関数やクラスに切り分けていって
依存関係を整理していく仕事が今日もまたはじまるお、
依存関係を整理していく仕事が今日もまたはじまるお、
678デフォルトの名無しさん
2021/05/03(月) 19:25:57.69ID:prCdHQql >>674
将来の破棄を前提とするなら、そのための準備が必要でしょうな。エージェントとかを使ってモジュール間の結合度を落とすとか、モジュール間で公開するIFを限定的にしてモジュール単体を捨てやすくするとか。
そのへんの話題はなかったのかしらん?
将来の破棄を前提とするなら、そのための準備が必要でしょうな。エージェントとかを使ってモジュール間の結合度を落とすとか、モジュール間で公開するIFを限定的にしてモジュール単体を捨てやすくするとか。
そのへんの話題はなかったのかしらん?
679デフォルトの名無しさん
2021/05/04(火) 12:15:45.91ID:PD6eTj67 >>675
でも、そのポリシーは「完全に捨てる」ことを
しないと機能しないよ。
結局、前に書いてある「あの関数」とか「例のクラス」とかが
縛ってしまうからね。
リファクタリングするだけじゃ、結局程度の問題でしかない
でも、そのポリシーは「完全に捨てる」ことを
しないと機能しないよ。
結局、前に書いてある「あの関数」とか「例のクラス」とかが
縛ってしまうからね。
リファクタリングするだけじゃ、結局程度の問題でしかない
680デフォルトの名無しさん
2021/05/04(火) 13:02:15.57ID:KyGD7Tmh >>679
どれは違う。
数学で代入したり、共通部分を括りだして M という変数に代入して
分かり易くしたり、展開したり、足し算して一つにまとめたり、
同類項をまとめたり、因数分解したりするなどして、式を簡単化
するのと同じようなことをプログラミングに置いて行えば、
前のソースを残しつつ、コードをわかり易くできる。
どれは違う。
数学で代入したり、共通部分を括りだして M という変数に代入して
分かり易くしたり、展開したり、足し算して一つにまとめたり、
同類項をまとめたり、因数分解したりするなどして、式を簡単化
するのと同じようなことをプログラミングに置いて行えば、
前のソースを残しつつ、コードをわかり易くできる。
681デフォルトの名無しさん
2021/05/05(水) 00:03:02.26ID:E1emjEBd export機能は確かに立ち消えになったが、現状のC++において
テンプレートの定義をcppに書くことは、明示的実体化をしたら一応はできる
どうするのかと制限事項とかはここを見たらワカル↓
■ テンプレート関数の宣言と実装を分離する方法 ( 補足 )
https://qiita.com/MasayaMizuhara/items/b1e3a53f62df88205eb7
一方、>>664で言っている
>見た目の問題だけなら、宣言と実装を分けることはできる
というのは(多分)こっち↓
■ テンプレート関数の宣言と実装を分離する方法
https://qiita.com/MasayaMizuhara/items/37f8c2a5462a4f7f8ea0
テンプレートの定義をcppに書くことは、明示的実体化をしたら一応はできる
どうするのかと制限事項とかはここを見たらワカル↓
■ テンプレート関数の宣言と実装を分離する方法 ( 補足 )
https://qiita.com/MasayaMizuhara/items/b1e3a53f62df88205eb7
一方、>>664で言っている
>見た目の問題だけなら、宣言と実装を分けることはできる
というのは(多分)こっち↓
■ テンプレート関数の宣言と実装を分離する方法
https://qiita.com/MasayaMizuhara/items/37f8c2a5462a4f7f8ea0
682デフォルトの名無しさん
2021/05/05(水) 00:14:15.46ID:E1emjEBd683デフォルトの名無しさん
2021/05/05(水) 12:46:37.29ID:9b321bHU684デフォルトの名無しさん
2021/05/06(木) 11:30:21.66ID:y+mCHZ2t C++で3値ブールってどうやって表現してますか
char?
char?
685デフォルトの名無しさん
2021/05/06(木) 11:36:37.33ID:ttDpb9zS 3値ブールをenum型で定義すればintサイズ
686デフォルトの名無しさん
2021/05/06(木) 12:00:53.01ID:li0qewo8 >>684
// #include <compare>
class strong_ordering;
class partial_ordering;
class weak_ordering;
および、これらのクラスの随伴関数operator<=>
// #include <compare>
class strong_ordering;
class partial_ordering;
class weak_ordering;
および、これらのクラスの随伴関数operator<=>
687デフォルトの名無しさん
2021/05/06(木) 13:22:29.39ID:QuOqilO4 >>684
unsined char
unsined char
688デフォルトの名無しさん
2021/05/06(木) 13:52:22.50ID:li0qewo8 スペルマ違い
689デフォルトの名無しさん
2021/05/06(木) 17:31:19.46ID:XU+FtvdI BOOST_FOREACHで自作クラスをイテレートするのダル
なぜC++11の範囲for文で完全にカバーする努力をしなかったのかますます謎だ
なぜC++11の範囲for文で完全にカバーする努力をしなかったのかますます謎だ
690デフォルトの名無しさん
2021/05/06(木) 18:32:04.97ID:q/dBsf9f vector<int> v;
vを初期化
for(int& x: v){
int y = move(x);
}
これって文法的には問題ないっていうかコンパイルエラーなりませんよね?
参照をmoveするってどういう意味なんですか?
vを初期化
for(int& x: v){
int y = move(x);
}
これって文法的には問題ないっていうかコンパイルエラーなりませんよね?
参照をmoveするってどういう意味なんですか?
691デフォルトの名無しさん
2021/05/06(木) 19:58:59.64ID:V23aVuxi 引数の型から返り値の型が明らかに決まるとき、返り値の型をわざわざテンプレート引数として書くのがめんどいんですが、省略するテクありますか
692デフォルトの名無しさん
2021/05/06(木) 20:33:45.29ID:2fdHoq/h >>691
引数の型で明らかに決まるんなら、戻り値の型を引数の型引数から導出される型として表現できるはずでしょ
引数の型で明らかに決まるんなら、戻り値の型を引数の型引数から導出される型として表現できるはずでしょ
693デフォルトの名無しさん
2021/05/06(木) 21:37:43.27ID:sft9s3lg >>689
boost foreachができたのは15年以上前だから仕方ない。今更使う必要もないと思うぞ
boost foreachができたのは15年以上前だから仕方ない。今更使う必要もないと思うぞ
694デフォルトの名無しさん
2021/05/06(木) 21:50:31.70ID:li0qewo8695デフォルトの名無しさん
2021/05/06(木) 22:05:14.28ID:R9i/0zUR >>691
autoとか?
autoとか?
696デフォルトの名無しさん
2021/05/06(木) 23:11:22.73ID:yKiPUGCL >>692
どうやって書くの?
template<class T1, class T2, class T3> T3 func(T1 a, T2 b){
T3 c;
return c;
}
みたいなやつのT3をテンプレート引数じゃなくしたいってことなんですが
どうやって書くの?
template<class T1, class T2, class T3> T3 func(T1 a, T2 b){
T3 c;
return c;
}
みたいなやつのT3をテンプレート引数じゃなくしたいってことなんですが
697デフォルトの名無しさん
2021/05/06(木) 23:21:31.82ID:ttDpb9zS >>696
int64_t ret = func<int, size_t, int64_t>(100, 200);
int64_t ret = func<int, size_t, int64_t>(100, 200);
698デフォルトの名無しさん
2021/05/06(木) 23:22:49.21ID:KJjM6itp >>694
v とか x は y = move(x) の後で使い回しても良いんですよね?
つまり、vector v の要素の参照 x を move しても、v の要素も x も影響を受けなくて、y の構築のされ方が違うだけということで良いんですかね?
超初歩的なこと聞いてすみません
v とか x は y = move(x) の後で使い回しても良いんですよね?
つまり、vector v の要素の参照 x を move しても、v の要素も x も影響を受けなくて、y の構築のされ方が違うだけということで良いんですかね?
超初歩的なこと聞いてすみません
699デフォルトの名無しさん
2021/05/06(木) 23:28:09.10ID:yKiPUGCL >>697
???
> func<int, size_t, int64_t>
の int64_t をテンプレート引数じゃなくしたいってことです
実行時に返り値の型が分かるような関数を作るテクはあるかと言い換えても良いです
無理なら無理で良いです
???
> func<int, size_t, int64_t>
の int64_t をテンプレート引数じゃなくしたいってことです
実行時に返り値の型が分かるような関数を作るテクはあるかと言い換えても良いです
無理なら無理で良いです
700デフォルトの名無しさん
2021/05/06(木) 23:29:49.59ID:RPQ+IjqH701デフォルトの名無しさん
2021/05/06(木) 23:31:52.81ID:qYpUBK3o >>698
右辺値参照はあくまで、一時オブジェクトですよと示すだけなのでそのコードでは問題ない
けどyがint yじゃなくてvectorなどの、
「一時オブジェクトを受け取った場合、メモリ確保やコピーのコストを減らすために中身のポインタだけすげ替える」
クラスだった場合、その後のvの中身は使えなくなる
moveはただのT &&へのキャストだよ
右辺値参照はあくまで、一時オブジェクトですよと示すだけなのでそのコードでは問題ない
けどyがint yじゃなくてvectorなどの、
「一時オブジェクトを受け取った場合、メモリ確保やコピーのコストを減らすために中身のポインタだけすげ替える」
クラスだった場合、その後のvの中身は使えなくなる
moveはただのT &&へのキャストだよ
702デフォルトの名無しさん
2021/05/06(木) 23:33:25.48ID:sft9s3lg >>700
うーん、そのためだけに使うってのはちょっとなあ
うーん、そのためだけに使うってのはちょっとなあ
703デフォルトの名無しさん
2021/05/06(木) 23:33:54.75ID:qYpUBK3o704デフォルトの名無しさん
2021/05/06(木) 23:44:41.27ID:XU+FtvdI705デフォルトの名無しさん
2021/05/07(金) 04:09:07.13ID:CpHYc6qO 初歩的な質問かつスレチ気味ですみません
vscodeを用いて簡単なコードを書きました
ビルドとデバッグを試みました
ビルドは出来ましたかデバッグにエラーが出て、No such file or directryとあります
パスを指定する際に日本語が含まれていることでエラーが出たのかと思うのですが正しいですか?
vscodeを用いて簡単なコードを書きました
ビルドとデバッグを試みました
ビルドは出来ましたかデバッグにエラーが出て、No such file or directryとあります
パスを指定する際に日本語が含まれていることでエラーが出たのかと思うのですが正しいですか?
706デフォルトの名無しさん
2021/05/07(金) 04:11:25.73ID:CpHYc6qO >>705すみません VScodeスレがあるのに間違えてこちらで質問してしまいました スルーしてください 大変失礼しました
707デフォルトの名無しさん
2021/05/07(金) 05:39:45.41ID:zt0L6rVc std::stringとstd::string_viewって何が違うんすか?
708デフォルトの名無しさん
2021/05/07(金) 06:15:48.18ID:5qs1Tt49709デフォルトの名無しさん
2021/05/07(金) 06:37:17.09ID:zt0L6rVc710デフォルトの名無しさん
2021/05/07(金) 06:38:54.78ID:p617inns >>709
string_viewを使う機会はほとんどない
string_viewを使う機会はほとんどない
711デフォルトの名無しさん
2021/05/07(金) 06:58:15.44ID:zt0L6rVc >>710
string_viewのほうが軽いのではないのですか?
string_viewのほうが軽いのではないのですか?
712デフォルトの名無しさん
2021/05/07(金) 07:49:58.08ID:HoYTY9P4 その違いがわかるほどのシステムなんてあるのか?
713デフォルトの名無しさん
2021/05/07(金) 08:46:52.79ID:p617inns バッファを操作するライブラリはC以来の蓄積があり、string_viewに移行する利点があまりない
これから新しく作るならstring_view特化でもいいかもしれないけど
これから新しく作るならstring_view特化でもいいかもしれないけど
714デフォルトの名無しさん
2021/05/07(金) 10:52:52.13ID:tUbn1npH テンプレート引数にstring::size()みたいな非定数を渡す方法教えてくんろ
715デフォルトの名無しさん
2021/05/07(金) 11:14:48.37ID:MIeBw/jN 部分文字列の抜き出し繰り返す構文解析的なプログラムをstringをつかって自前でゴリゴリ1から書くなら、string_viewでかなり速度上がりそうではあるね
716デフォルトの名無しさん
2021/05/07(金) 11:25:05.02ID:xRxKqUtn717デフォルトの名無しさん
2021/05/07(金) 11:31:31.31ID:tUbn1npH718デフォルトの名無しさん
2021/05/07(金) 11:37:35.53ID:xRxKqUtn 原理的に不可能だよ
定数値が必要ですとか言われるやろ
実行時分岐でテンプレート引数を決めるとかは出来るだろうけど
定数値が必要ですとか言われるやろ
実行時分岐でテンプレート引数を決めるとかは出来るだろうけど
719デフォルトの名無しさん
2021/05/07(金) 11:39:55.84ID:MIeBw/jN >>717
使う全ての長さの分のstd::arrayのパターンをマクロか何かで生成して、入り口で分岐させればいけるんじゃない?w
使う全ての長さの分のstd::arrayのパターンをマクロか何かで生成して、入り口で分岐させればいけるんじゃない?w
720デフォルトの名無しさん
2021/05/07(金) 11:45:23.03ID:fHTm+yKw721デフォルトの名無しさん
2021/05/07(金) 11:47:37.42ID:xRxKqUtn size_t n = str.size();
switch (n) {
case:1
return array<int, 1>;
case 2:
...
こんなん?(でも戻り値の型の違いもテンプレートに出来ないのでanyとかで吸収しないといけない
switch (n) {
case:1
return array<int, 1>;
case 2:
...
こんなん?(でも戻り値の型の違いもテンプレートに出来ないのでanyとかで吸収しないといけない
722デフォルトの名無しさん
2021/05/07(金) 11:51:06.04ID:tUbn1npH ありがとうございます
上の方で関数の返り値用のテンプレート引数をautoで省略したいとか言ってた者なんですが、大人しくテンプレート引数一個追加します
上の方で関数の返り値用のテンプレート引数をautoで省略したいとか言ってた者なんですが、大人しくテンプレート引数一個追加します
723デフォルトの名無しさん
2021/05/07(金) 12:26:02.94ID:5qs1Tt49 >>717
system()でコンパイラを呼び出してDLLをビルドしてLoadLibrary()
system()でコンパイラを呼び出してDLLをビルドしてLoadLibrary()
724デフォルトの名無しさん
2021/05/07(金) 12:43:40.65ID:xRxKqUtn あーarrayの必要サイズがわからん状態で型決めようとしてたのか
それはユーザーが指定しないとしょうがないね
それはユーザーが指定しないとしょうがないね
725デフォルトの名無しさん
2021/05/07(金) 12:55:13.65ID:tUbn1npH726デフォルトの名無しさん
2021/05/07(金) 14:05:11.82ID:2HL1lUWO pow(int, int) の型って int なん?
Promoted pow(Arithmetic1, Arithmetic2) とあるが、int と int が promote されたら何になるの?
Promoted pow(Arithmetic1, Arithmetic2) とあるが、int と int が promote されたら何になるの?
727はちみつ餃子 ◆8X2XSCHEME
2021/05/07(金) 14:39:02.01ID:xLSEaA6V >>707
std::string はそれ自体が文字列のデータを所有している。
std::string_view は他の文字列の一部 (または全部) の範囲を表現しているだけで、文字列の本体は所有していない。
(なので参照先の寿命が先に尽きたらダングリングになることに注意。)
文字列全体の参照は単に std::string& で良いのだが、
一部の範囲だけを表す型が従来は無かったので std::string_view が新設された。
std::string_view は Go や Rust で言うところのスライスのような概念に近い。
std::string はそれ自体が文字列のデータを所有している。
std::string_view は他の文字列の一部 (または全部) の範囲を表現しているだけで、文字列の本体は所有していない。
(なので参照先の寿命が先に尽きたらダングリングになることに注意。)
文字列全体の参照は単に std::string& で良いのだが、
一部の範囲だけを表す型が従来は無かったので std::string_view が新設された。
std::string_view は Go や Rust で言うところのスライスのような概念に近い。
728デフォルトの名無しさん
2021/05/07(金) 21:40:55.35ID:e3vaIAON std::ifstream ifstream;
ifstream.open(filePath);
std::stringstream stream;
stream << ifstream.rdbuf();
とやったとします…この場合…flushって必要なんでしょうか?…
stream << ifstream1.rdbuf() << std::flushやstream.flush()…そもそもifstream.rdbuf()を使っているのが…
なんか…怪しくて…全て書き込まれていない事って…起きるんでしょうか?
ofstreamだと…flushがいるのは解るんですが…この場合って…どうなん?
stream << ifstream.rdbuf()の振る舞いが解らなくて…本当にいつも…全部…読めているんでしょうか?
ifstream.rdbuf()って…怪しいじゃないですか…悩みます…。誰か…詳しい人…います?
ifstream.open(filePath);
std::stringstream stream;
stream << ifstream.rdbuf();
とやったとします…この場合…flushって必要なんでしょうか?…
stream << ifstream1.rdbuf() << std::flushやstream.flush()…そもそもifstream.rdbuf()を使っているのが…
なんか…怪しくて…全て書き込まれていない事って…起きるんでしょうか?
ofstreamだと…flushがいるのは解るんですが…この場合って…どうなん?
stream << ifstream.rdbuf()の振る舞いが解らなくて…本当にいつも…全部…読めているんでしょうか?
ifstream.rdbuf()って…怪しいじゃないですか…悩みます…。誰か…詳しい人…います?
729デフォルトの名無しさん
2021/05/07(金) 22:47:52.85ID:e3vaIAON ostreamを継承してるので…一応…儀式として… << std::flush を付けておきます…
730デフォルトの名無しさん
2021/05/07(金) 22:47:55.63ID:2z/2Kbob ヒエッ…、、、く、車輪のx発明の人……!
731はちみつ餃子 ◆8X2XSCHEME
2021/05/07(金) 23:09:25.10ID:xLSEaA6V >>728
operator<< を呼んだ直後の時点では完全に書き込まれていない可能性は有る。
ただ、色んな場面で pubsync が呼ばれて辻褄合わせをすることになってるんで、
その時点で完全でなくても大抵の場合に問題にならない。
ストリームがキャラクタデバイスに接続されている場合のような
書き出しのタイミングが意味を持つような状況でなければ明示的に flush が
必要な場面はあまりない。
operator<< を呼んだ直後の時点では完全に書き込まれていない可能性は有る。
ただ、色んな場面で pubsync が呼ばれて辻褄合わせをすることになってるんで、
その時点で完全でなくても大抵の場合に問題にならない。
ストリームがキャラクタデバイスに接続されている場合のような
書き出しのタイミングが意味を持つような状況でなければ明示的に flush が
必要な場面はあまりない。
732デフォルトの名無しさん
2021/05/07(金) 23:41:24.93ID:e3vaIAON stream << ifstream.rdbuf() の振る舞いが解らなくて…怪しいと思っていたけど…大丈夫らしい…
https://stackoverflow.com/questions/49546569/how-does-this-one-stream-command-read-in-an-entire-file-in-c
https://stackoverflow.com/questions/49546569/how-does-this-one-stream-command-read-in-an-entire-file-in-c
733デフォルトの名無しさん
2021/05/08(土) 00:06:58.58ID:e+sagIsH coutとcerrでコンソールに出すときcoutを適宜flushしないとcoutとcerrで表示が同期しないという印象、
734デフォルトの名無しさん
2021/05/08(土) 01:11:26.04ID:04d5KsyW coutのようにバッファリングしながらもstderrに出力するclog
735デフォルトの名無しさん
2021/05/08(土) 07:59:26.09ID:St3wXYGV >>726
promoteはintよりサイズの小さい整数がintになることだぞ
浮動小数点の場合はdoubleになること
powは<cmath>で次のように宣言されていて
float pow(float x, float y);
double pow(double x, double y);
long double pow(long double x, long double y);
pow(int, int)の返却値はdoubleとなる
promoteはintよりサイズの小さい整数がintになることだぞ
浮動小数点の場合はdoubleになること
powは<cmath>で次のように宣言されていて
float pow(float x, float y);
double pow(double x, double y);
long double pow(long double x, long double y);
pow(int, int)の返却値はdoubleとなる
736デフォルトの名無しさん
2021/05/08(土) 14:22:53.92ID:iyfickIa hoge() という関数の意味で hoge_() という書き方を使いたいとき、using hoge_ = hoge ってできますか
738デフォルトの名無しさん
2021/05/08(土) 15:15:44.69ID:iyfickIa739デフォルトの名無しさん
2021/05/08(土) 15:21:51.05ID:IOJOTrlX C++にmemcpyの代替ってあるんですか?
メモリが連続でコピーする区間が重複してないときに型 T のものを x 個分コピーするときは、2021年現在も
memcpy(destのアドレス, srcのアドレス, sizeof(T)*x);
で良いんですかね?
メモリが連続でコピーする区間が重複してないときに型 T のものを x 個分コピーするときは、2021年現在も
memcpy(destのアドレス, srcのアドレス, sizeof(T)*x);
で良いんですかね?
740デフォルトの名無しさん
2021/05/08(土) 15:24:23.88ID:Jy6pPGdO >>725
tuple使え
tuple使え
741デフォルトの名無しさん
2021/05/08(土) 15:27:28.70ID:Jy6pPGdO >>728
stream << ifstream1.rdbuf() << std::flushやstream.flush()
ifstream1.rdbuf() を実行する前に fush しないと意味無いと思わないか?
stream << ifstream1.rdbuf() << std::flushやstream.flush()
ifstream1.rdbuf() を実行する前に fush しないと意味無いと思わないか?
742はちみつ餃子 ◆8X2XSCHEME
2021/05/08(土) 15:31:41.86ID://zoyCL6 >>736-738
関数の別名を作るなら constexpr を付けておいたほうがいいかもね。
関数の別名を作るなら constexpr を付けておいたほうがいいかもね。
743はちみつ餃子 ◆8X2XSCHEME
2021/05/08(土) 15:42:46.92ID://zoyCL6 >>739
C++ 的には std::copy を使うんでないかな。
memcpy はメモリが連続していることを利用した最適化をしている可能性が高くて効率的だけど、
T が trivially copyable でないときに memcpy で正しく複製できるかは未定義なので、
汎用的な部品として構築するには memcpy は向いてない。
低レイヤでビットパターンのコピーで良いことがわかっているなら memcpy でも良いだろうし、場面による。
C++ 的には std::copy を使うんでないかな。
memcpy はメモリが連続していることを利用した最適化をしている可能性が高くて効率的だけど、
T が trivially copyable でないときに memcpy で正しく複製できるかは未定義なので、
汎用的な部品として構築するには memcpy は向いてない。
低レイヤでビットパターンのコピーで良いことがわかっているなら memcpy でも良いだろうし、場面による。
744デフォルトの名無しさん
2021/05/08(土) 15:43:03.39ID:09/9BleE テンプレート引数の部分指定みたいのってないんですかね
template<class T, int x, int y> auto hoge(array<T, x> fuga){
、、、
}
って関数を
array<int, 5> aaa;
hoge<int, 5, 8>(aaa);
みたいに呼び出すときってintと5はaaaを渡した時点で分かりきってますよね?
だから
hoge<8>(aaa);
みたいに呼べたら良いなと思ったんですが
template<class T, int x, int y> auto hoge(array<T, x> fuga){
、、、
}
って関数を
array<int, 5> aaa;
hoge<int, 5, 8>(aaa);
みたいに呼び出すときってintと5はaaaを渡した時点で分かりきってますよね?
だから
hoge<8>(aaa);
みたいに呼べたら良いなと思ったんですが
745デフォルトの名無しさん
2021/05/08(土) 15:57:41.09ID:+il+Qk57 int yをテンプレート引数の最初に持ってきてみ
746デフォルトの名無しさん
2021/05/08(土) 15:58:45.38ID:+il+Qk57 >>740
見当違い
見当違い
747はちみつ餃子 ◆8X2XSCHEME
2021/05/08(土) 15:59:25.53ID://zoyCL6 >>744
後ろのほうのパラメータは省略できるが、頭のほうのパラメータは省略できない。
順序を変えれば OK
#include <array>
template<int y, std::size_t x, class T> auto hoge(std::array<T, x> fuga){
}
int main(void) {
std::array<int, 5> aaa;
hoge<8>(aaa);
}
後ろのほうのパラメータは省略できるが、頭のほうのパラメータは省略できない。
順序を変えれば OK
#include <array>
template<int y, std::size_t x, class T> auto hoge(std::array<T, x> fuga){
}
int main(void) {
std::array<int, 5> aaa;
hoge<8>(aaa);
}
748デフォルトの名無しさん
2021/05/08(土) 16:48:31.28ID:09/9BleE >>745
あざ!
あざ!
749デフォルトの名無しさん
2021/05/08(土) 20:11:34.06ID:IOJOTrlX ある条件でvectorを返してある条件でintを返す関数って作れないんですよね?
750デフォルトの名無しさん
2021/05/08(土) 20:16:14.63ID:grHx02fv >>749 「条件」がコンパイル時に決まるものなら作れるよ。
実行時に決まる条件でも variant<vector, int> を返す関数なら作れるよ。
実行時に決まる条件でも variant<vector, int> を返す関数なら作れるよ。
751デフォルトの名無しさん
2021/05/08(土) 20:47:53.13ID:coBHIhPM >>749
そんなふうに実装する必要ある?
そんなふうに実装する必要ある?
752デフォルトの名無しさん
2021/05/08(土) 21:04:51.07ID:IOJOTrlX753デフォルトの名無しさん
2021/05/08(土) 22:02:29.92ID:04d5KsyW overlord
754デフォルトの名無しさん
2021/05/08(土) 23:21:52.15ID:55qg1DzP std::anyつかえば実行時でも出来るよ
755デフォルトの名無しさん
2021/05/09(日) 12:35:35.77ID:Ys9Xflyj あるオブジェクトの参照を受けたときはそのオブジェクトを変更する void 関数で、一時オブジェクトを受けたときはそれを変更したものを返す関数
を作りたいとき、後者ってどう表現したら良いんですかね?
を作りたいとき、後者ってどう表現したら良いんですかね?
756デフォルトの名無しさん
2021/05/09(日) 13:27:45.76ID:WMytKT+1 move
757デフォルトの名無しさん
2021/05/09(日) 13:56:14.42ID:Ys9Xflyj >>756
右辺値を受け取った場合をオーバーロードするってことですか?
右辺値を受け取った場合をオーバーロードするってことですか?
758デフォルトの名無しさん
2021/05/09(日) 15:01:51.23ID:RwrAFKze つ右辺値参照
void func(Hoge& h) {
...
}
Hoge func(Hoge&& h) {
...
return h;
}
void func(Hoge& h) {
...
}
Hoge func(Hoge&& h) {
...
return h;
}
759はちみつ餃子 ◆8X2XSCHEME
2021/05/10(月) 14:33:11.74ID:iq5b2KkV そういう形でオーバーロードするのはお勧めできないな。
ムーブできるところでは知らんうちにムーブになって効率的に動作してたってのが理想的で、
右辺値か左辺値かによって使い方も異なるってのはやめたほうがいい。
別の名前を付けたほうが良さそうに思う。
ムーブできるところでは知らんうちにムーブになって効率的に動作してたってのが理想的で、
右辺値か左辺値かによって使い方も異なるってのはやめたほうがいい。
別の名前を付けたほうが良さそうに思う。
760デフォルトの名無しさん
2021/05/10(月) 15:14:27.70ID:lCZGOQhN stringstream hoge を seekp するとき
hoge.seekp(a, ios::cur);
と
hoge.seekp(a, ios_base::cur);
のどちらが正しいですか?
hoge.seekp(a, ios::cur);
と
hoge.seekp(a, ios_base::cur);
のどちらが正しいですか?
761はちみつ餃子 ◆8X2XSCHEME
2021/05/10(月) 16:48:01.25ID:iq5b2KkV >>760
どちらでも問題ない。 ios::cur は ios_base から継承したもので、同一の存在。
しかし習慣的には ios_base を直接使うべきではない (ios::cur を使うべき) と思う。
どちらでも問題ない。 ios::cur は ios_base から継承したもので、同一の存在。
しかし習慣的には ios_base を直接使うべきではない (ios::cur を使うべき) と思う。
762デフォルトの名無しさん
2021/05/10(月) 18:22:42.09ID:bdG5L98z 右辺値参照って、扱ってるクラスがムーブコンストラクタを持ってない限りは、「これは右辺値参照です」という意思を表示することにしかならんのですよね?
763デフォルトの名無しさん
2021/05/10(月) 20:56:06.60ID:CKsNew1t 非const&はともかく
const&と&&の多重定義は普通だろ
const&と&&の多重定義は普通だろ
764デフォルトの名無しさん
2021/05/11(火) 03:49:55.52ID:NBkGK4p/ template<class T> void hoge(pair< vector<T>, vector<T> >);
を、vector<int> A, B として
hoge({A, B})
って呼ぶのは T の deduction/substitution に失敗するからダメで
hoge(make_pair(A, B))
って呼ぶのはオッケーだったんだがホワイ?
そんくらいできろやって思うんだが
を、vector<int> A, B として
hoge({A, B})
って呼ぶのは T の deduction/substitution に失敗するからダメで
hoge(make_pair(A, B))
って呼ぶのはオッケーだったんだがホワイ?
そんくらいできろやって思うんだが
765はちみつ餃子 ◆8X2XSCHEME
2021/05/11(火) 04:17:34.41ID:sf6ddr3r >>764
推論できないわけではなくて std::initializer_list に推論されるというルール。
そのルールが結果的に妥当かどうかはともかく今更変えるわけにもいかんし、
仕方がないんだわ。
推論できないわけではなくて std::initializer_list に推論されるというルール。
そのルールが結果的に妥当かどうかはともかく今更変えるわけにもいかんし、
仕方がないんだわ。
766デフォルトの名無しさん
2021/05/11(火) 11:21:06.99ID:FWZS8iTB tuple
767デフォルトの名無しさん
2021/05/12(水) 00:29:14.70ID:nKEkaipq >>591
シープラプラも混ぜて
シープラプラも混ぜて
768デフォルトの名無しさん
2021/05/12(水) 22:39:19.73ID:LXLc2NzC 可変個の参照をとる関数の一番簡潔な書き方って何ですかね?
呼び出すときは
hoge(a, b, c, d)
あるいは
hoge({a, b, c, d})
みたいにしたいです
呼び出すときは
hoge(a, b, c, d)
あるいは
hoge({a, b, c, d})
みたいにしたいです
769蟻人間 ◆T6xkBnTXz7B0
2021/05/13(木) 00:03:41.49ID:/FXyk3Zs いくつか方法がある:
va_list
std::initializer_list
variadic template
va_list
std::initializer_list
variadic template
770はちみつ餃子 ◆8X2XSCHEME
2021/05/13(木) 00:25:58.06ID:WYE+obYa 要素の型が全て同じなら std::initializer_list が比較的扱いやすいとは思うが、
それだけでまかなえないからこそ選択肢があるのでもう少し条件を提示して欲しいね。
それだけでまかなえないからこそ選択肢があるのでもう少し条件を提示して欲しいね。
771デフォルトの名無しさん
2021/05/13(木) 14:22:44.17ID:rT5yynw0 防衛省が中国のハッカーとやり合える人材を募集中 年収最高2000万円
https://leia.5ch.net/test/read.cgi/poverty/1620874048/
https://leia.5ch.net/test/read.cgi/poverty/1620874048/
772デフォルトの名無しさん
2021/05/13(木) 14:25:28.62ID:gQUYeg5t vector
array
tuple
array
tuple
773デフォルトの名無しさん
2021/05/13(木) 15:33:03.69ID:VhoQaRqh 上限2000万じゃ安すぎ
774デフォルトの名無しさん
2021/05/13(木) 15:38:49.41ID:tJiNVUVY 武器禁輸措置に抵触する認定プログラマのお値段がたったの2000万円?
安すぎだろ
安すぎだろ
775はちみつ餃子 ◆8X2XSCHEME
2021/05/13(木) 15:57:38.17ID:WYE+obYa そういう額って「保証する額」なので上限が保証されてても意味ないんだよな。
776デフォルトの名無しさん
2021/05/13(木) 16:06:58.80ID:ItPDnKAp ベストエフォートが 1Gbpsでも現実は 10Mbpsみたいな話だな。
777デフォルトの名無しさん
2021/05/13(木) 16:08:53.03ID:ItPDnKAp 最近知ったことだけど回線品質が悪いからではなく沢山の人に共有利用させすぎているせいで速度が出ないだけらしい。
実際、ダウンロードは遅いのにアップロードは速いのはそれで説明できるそうだ。
実際、ダウンロードは遅いのにアップロードは速いのはそれで説明できるそうだ。
778はちみつ餃子 ◆8X2XSCHEME
2021/05/13(木) 16:33:36.23ID:WYE+obYa779デフォルトの名無しさん
2021/05/13(木) 16:35:51.69ID:VhoQaRqh ダウンロードが遅い原因は経路の他にサーバーという場合もあるね
780デフォルトの名無しさん
2021/05/13(木) 16:55:36.92ID:0opMfQ+n 人混みではWiFiも奪い合いでブツブツ切れまくる
保証するのは普通「下限」だよな
保証するのは普通「下限」だよな
781デフォルトの名無しさん
2021/05/13(木) 17:54:36.06ID:ItPDnKAp782デフォルトの名無しさん
2021/05/13(木) 20:55:57.03ID:NATYYilK 給料でも、100万円みたいに上限を書いているものは、無意味。
嘘広告と同じで、絶対にもらえない
給料で大切なのは、15万円みたいな下限。
最低保証額
嘘広告と同じで、絶対にもらえない
給料で大切なのは、15万円みたいな下限。
最低保証額
783デフォルトの名無しさん
2021/05/13(木) 20:59:43.10ID:bYaECMnR 何のスレだよ
784デフォルトの名無しさん
2021/05/14(金) 00:45:53.77ID:2w1FBHD8 最低時給みたいなもんか
785はちみつ餃子 ◆8X2XSCHEME
2021/05/14(金) 02:31:20.51ID:Ezk9shwq 直接的に関係ない話になってはいるが、
保証の内容の違いはプログラミング的にも割と重要な話。
十秒で十の仕事をするという保証と
一秒で一の仕事をするという保証は異なる。
保証の内容の違いはプログラミング的にも割と重要な話。
十秒で十の仕事をするという保証と
一秒で一の仕事をするという保証は異なる。
786デフォルトの名無しさん
2021/05/14(金) 02:47:39.90ID:YIIiTt5H アホみたいな質問というか雑談なんですが、皆さんは同じ型のものを2つまとめるのにpairって使いますか?
2要素vectorの方が要素アクセスのしやすさ等の観点から自分にとっても他人にとっても親切な気がしてきました
2要素vectorの方が要素アクセスのしやすさ等の観点から自分にとっても他人にとっても親切な気がしてきました
787はちみつ餃子 ◆8X2XSCHEME
2021/05/14(金) 02:57:56.08ID:Ezk9shwq >>786
同じ型かつ二要素という保証が重要な場面なら std::pair より std::array を使う。
同じ型かつ二要素という保証が重要な場面なら std::pair より std::array を使う。
788デフォルトの名無しさん
2021/05/14(金) 03:23:37.52ID:yHal4m5W std::pairは機能拡張に弱いので自発的には使わない方がいい
789デフォルトの名無しさん
2021/05/14(金) 05:56:11.89ID:RnSHWQNF IntelコンパイラはParallel Studioが終了してoneAPIになったけど、
これ無料なん?Intelからは無料ダウソできるけど、
エクセルソフトは有料販売続けてるのはどこが違うの?
これ無料なん?Intelからは無料ダウソできるけど、
エクセルソフトは有料販売続けてるのはどこが違うの?
790デフォルトの名無しさん
2021/05/14(金) 06:01:58.07ID:UqkRQTKM ダウソってなんスか?
791デフォルトの名無しさん
2021/05/14(金) 06:20:13.81ID:7h2AIEzB792デフォルトの名無しさん
2021/05/14(金) 06:21:57.15ID:RnSHWQNF カワウソの一種です
793デフォルトの名無しさん
2021/05/14(金) 06:23:51.18ID:7h2AIEzB template <class T>
struct point : private std::pair<T, T>
{
T& x;
T& y;
point() : x(std::pair<T>::first), y(std::pair<T>::second) { }
};
・・・アホくせw
struct point : private std::pair<T, T>
{
T& x;
T& y;
point() : x(std::pair<T>::first), y(std::pair<T>::second) { }
};
・・・アホくせw
794デフォルトの名無しさん
2021/05/14(金) 07:22:41.27ID:+gtYWEA4 pairてmap以外で使った記憶ないな
795デフォルトの名無しさん
2021/05/14(金) 07:25:10.38ID:yHal4m5W std::equal_range() の戻り値がstd::pairだよ
796デフォルトの名無しさん
2021/05/14(金) 10:51:44.98ID:R2Ezzb7N std::pair を使うかという問いに対して std::pair をなんと継承している例を持ち出してアホくさいとはね
アホくさいんじゃなくアホなんだよ
アホくさいんじゃなくアホなんだよ
797デフォルトの名無しさん
2021/05/14(金) 12:30:32.58ID:7h2AIEzB >>796
あ? 自分は答えないくせに他人のコメントにいちゃもんつけるやつにだけは言われたかねえぜ
あ? 自分は答えないくせに他人のコメントにいちゃもんつけるやつにだけは言われたかねえぜ
798デフォルトの名無しさん
2021/05/14(金) 12:31:39.95ID:7h2AIEzB どーせ継承いらん厨とかそういう手合いのゴミだろてめえ
799デフォルトの名無しさん
2021/05/14(金) 12:47:38.30ID:678S/iU6 twitterでC++というキーワードがどうやっても検索できないのは独占禁止法に抵触するよね?
>>771
0 の数が二つ足りない
0 の数が二つ足りない
802デフォルトの名無しさん
2021/05/14(金) 21:31:11.99ID:72ZodHJE こういうのは技術だけじゃダメだからなあ
相手の心理を読み解く嫌らしいまでの知略がないと
相手の心理を読み解く嫌らしいまでの知略がないと
803デフォルトの名無しさん
2021/05/14(金) 23:11:38.64ID:R2Ezzb7N 継承は多用こそしないが要る
std::pairの継承はもちろんしない
std::pairは使う
終わり
同じ型で2要素のものをpairにするかvectorにするかarray<T, 2>にするかは好みとしか言いようがない
どれにしたから怒られるということもなかろう
std::pairの継承はもちろんしない
std::pairは使う
終わり
同じ型で2要素のものをpairにするかvectorにするかarray<T, 2>にするかは好みとしか言いようがない
どれにしたから怒られるということもなかろう
804デフォルトの名無しさん
2021/05/15(土) 00:42:32.70ID:JNomAybm でもそれが可能だということはやってはダメと言われてるわけでは無く許可されてることだろ
本当にダメならそもそも出来ないハズだ
やれることをやってなんでダメと言われるのか全く理解出来ない
出来ないのであれば不可能にすべきだがそうなってない、
ならばやっていいことに決まってる
本当にダメならそもそも出来ないハズだ
やれることをやってなんでダメと言われるのか全く理解出来ない
出来ないのであれば不可能にすべきだがそうなってない、
ならばやっていいことに決まってる
805はちみつ餃子 ◆8X2XSCHEME
2021/05/15(土) 00:48:41.02ID:pVi51x8H やればいいよ。
その結果がどうなるか知らんけど。
その結果がどうなるか知らんけど。
806デフォルトの名無しさん
2021/05/15(土) 01:23:50.42ID:ACVNfbfy >>793は無理してpair使うとアホなことになると言いたいのかと思ってたんだが違うのか
807デフォルトの名無しさん
2021/05/15(土) 01:23:56.78ID:GOJIKllV 乗用車は余裕で時速150km出せる
808デフォルトの名無しさん
2021/05/15(土) 06:16:06.77ID:ASJTiJTT >>801
インターフェイスも否定する?
インターフェイスも否定する?
809デフォルトの名無しさん
2021/05/15(土) 06:35:29.42ID:ASJTiJTT 自分は使わない、以上だってpgr
コードを常に1人で書く人ってことだね
チームでやってるときに異端な主張で
クセ強すぎるコード書くやついたら叩き出す
コードを常に1人で書く人ってことだね
チームでやってるときに異端な主張で
クセ強すぎるコード書くやついたら叩き出す
810デフォルトの名無しさん
2021/05/15(土) 06:43:05.27ID:tihXB0Cj 大昔全部ヘッダファイルにコード書いてやった俺は正しかった
今になって大流行
自分の先見の明が恐ろしい
今になって大流行
自分の先見の明が恐ろしい
811デフォルトの名無しさん
2021/05/15(土) 07:20:42.20ID:yI+HbYJi XXという機能は要らないという奴はたいてい
自分の特定ジャンルのコーディングしかしたことない奴が多い
自分の特定ジャンルのコーディングしかしたことない奴が多い
812デフォルトの名無しさん
2021/05/15(土) 07:51:13.54ID:tihXB0Cj ほんとうにいらないものもある
813デフォルトの名無しさん
2021/05/15(土) 07:57:34.33ID:MVemCiVF 本当にいらないものは大体ここ10年の規格改訂で削除かdeprecated行きになってる
まだそうなってないものは多分必要なんだよ
まだそうなってないものは多分必要なんだよ
>>808
否定しません
否定しません
815デフォルトの名無しさん
2021/05/15(土) 09:35:04.56ID:WhAcSt6Q ヘッダファイル内で定数使いたいときって結局どうしたら良いんですか
ネームスペース作るほどじゃないが、スコープはそのファイル内だけで良いって状況です
ネームスペース作るほどじゃないが、スコープはそのファイル内だけで良いって状況です
816デフォルトの名無しさん
2021/05/15(土) 10:12:39.02ID:GOJIKllV 32bit整数なら列挙型
それ以外なら定数をあきらめて定数を返す関数にする
それ以外なら定数をあきらめて定数を返す関数にする
817デフォルトの名無しさん
2021/05/15(土) 10:30:59.22ID:WhAcSt6Q >>816
あざす!
あざす!
818デフォルトの名無しさん
2021/05/15(土) 12:13:25.04ID:eYtIld1h819デフォルトの名無しさん
2021/05/15(土) 12:19:34.55ID:eYtIld1h820デフォルトの名無しさん
2021/05/15(土) 12:36:48.16ID:DTE+piln821デフォルトの名無しさん
2021/05/15(土) 12:46:36.24ID:DTE+piln >>820
ただし、個人的には委譲についてはそんなに詳しくは無く、#include程度のものだという理解しかない。
しかし、C++のクラスには元々継承の機能が付いているのだから敢えて委譲方式を使う必要は無いと思う。
また、委譲にしたときのデメリットは分かるが、メリットは分からないし。
ただし、個人的には委譲についてはそんなに詳しくは無く、#include程度のものだという理解しかない。
しかし、C++のクラスには元々継承の機能が付いているのだから敢えて委譲方式を使う必要は無いと思う。
また、委譲にしたときのデメリットは分かるが、メリットは分からないし。
822デフォルトの名無しさん
2021/05/15(土) 12:53:37.11ID:ACVNfbfy C++において委譲てメンバ変数に持つだけやろ
vectorにデータ保持するクラスがvector継承とかおかしなことになる
昔から言われてるis-aとhas-aで考えるのが自然じゃないの
vectorにデータ保持するクラスがvector継承とかおかしなことになる
昔から言われてるis-aとhas-aで考えるのが自然じゃないの
823デフォルトの名無しさん
2021/05/15(土) 12:59:47.23ID:l/htYdSr 継承は今となっては注意して使うべきものって評価が定着したものと思ってた
リスコフ置換原理とか、差分プログラミングとか、composition over inheritanceとか
リスコフ置換原理とか、差分プログラミングとか、composition over inheritanceとか
824デフォルトの名無しさん
2021/05/15(土) 13:08:50.36ID:DTE+piln >>823
そんな高度なことをUQが知ってるのか?
そんな高度なことをUQが知ってるのか?
825デフォルトの名無しさん
2021/05/15(土) 13:18:14.47ID:ZTZob1AZ >>820
確かにいちいち相手を口撃しないと議論もできないのは頭が悪いね
確かにいちいち相手を口撃しないと議論もできないのは頭が悪いね
826デフォルトの名無しさん
2021/05/15(土) 13:58:00.84ID:tE3nOT6E > 個人的には委譲についてはそんなに詳しくは無く、#include程度のものだという理解しかない。
> vector継承
えっちょっとレベル低過ぎて驚愕してるんだが、休日プログラマたちが張り切って変なこと言ってるだけだよね?
「委譲は#include程度のもの」は意味不明としか言いようがないし、STLコンテナの継承って典型的なアンチパターンなんだがなんでそんなもの引き合いに出してくるのか分からんし
> vector継承
えっちょっとレベル低過ぎて驚愕してるんだが、休日プログラマたちが張り切って変なこと言ってるだけだよね?
「委譲は#include程度のもの」は意味不明としか言いようがないし、STLコンテナの継承って典型的なアンチパターンなんだがなんでそんなもの引き合いに出してくるのか分からんし
827デフォルトの名無しさん
2021/05/15(土) 15:34:06.78ID:eYtIld1h828デフォルトの名無しさん
2021/05/15(土) 15:35:17.73ID:eYtIld1h ああ違う
R *(P a){return (m->($1))(a);}
観たいな感じ
R *(P a){return (m->($1))(a);}
観たいな感じ
829デフォルトの名無しさん
2021/05/15(土) 15:57:12.68ID:mF3YDsn5 >>820
>継承はオブジェクト指向ではなくてはならないもの
私も昔からそう習ってきてはいましたが、さて、いろいろ書いてみたものの「継承で書いた方がスマート」という経験が皆無なのです、「委譲で書いた方がスマート」ならば沢山あるのですが
あえて継承が有用な場面といえば、エラー等の例外関係の個々のクラスを大雑把にカテゴライズするための基底型、くらいのものでしょうか…
なにかお題を定めて「@:継承だけを使って書け、A:委譲だけを使って書け、B:@Aを評価せよ」という例をいただけないでしょうか。
>継承はオブジェクト指向ではなくてはならないもの
私も昔からそう習ってきてはいましたが、さて、いろいろ書いてみたものの「継承で書いた方がスマート」という経験が皆無なのです、「委譲で書いた方がスマート」ならば沢山あるのですが
あえて継承が有用な場面といえば、エラー等の例外関係の個々のクラスを大雑把にカテゴライズするための基底型、くらいのものでしょうか…
なにかお題を定めて「@:継承だけを使って書け、A:委譲だけを使って書け、B:@Aを評価せよ」という例をいただけないでしょうか。
831デフォルトの名無しさん
2021/05/15(土) 17:50:08.18ID:DTE+piln >>830
「委譲」って具体的にどういう書き方のことなの。
「委譲」って具体的にどういう書き方のことなの。
832デフォルトの名無しさん
2021/05/15(土) 17:55:09.56ID:vSRH6pvU >>831
ええ、頭の働きが悪いと煽りつつそれ聞いちゃうの?
ええ、頭の働きが悪いと煽りつつそれ聞いちゃうの?
833デフォルトの名無しさん
2021/05/15(土) 17:56:27.49ID:DTE+piln834デフォルトの名無しさん
2021/05/15(土) 17:57:27.50ID:DTE+piln >>832
委譲という言葉はC++では余り耳慣れなかったので本人がどういう意味で使ってるか聞いて見たい。
委譲という言葉はC++では余り耳慣れなかったので本人がどういう意味で使ってるか聞いて見たい。
835デフォルトの名無しさん
2021/05/15(土) 17:59:33.89ID:DTE+piln C#でのdelegate、Rubyの委譲(#includeみたいに見える)、Wikipediaに載っている委譲、それぞれかなり違うことを言っているように思える。
記憶だと、C#のdelegateって他の言語でClosureと呼ばれているもののように思えた。
FunctorとClosureの違いはちゃんと分かってないが。
記憶だと、C#のdelegateって他の言語でClosureと呼ばれているもののように思えた。
FunctorとClosureの違いはちゃんと分かってないが。
836デフォルトの名無しさん
2021/05/15(土) 18:02:34.95ID:DTE+piln >>835
あ、Rubyは、Mix-inの方だったわ、スマン。
あ、Rubyは、Mix-inの方だったわ、スマン。
837はちみつ餃子 ◆8X2XSCHEME
2021/05/15(土) 18:05:50.33ID:pVi51x8H 別のところに処理を丸投げするような仕組み (ただし丸投げする先をディスパッチする仕組みには色々とある) が委譲なので、
基底クラスのメンバ関数が呼ばれるのも広義には委譲の一種なんじゃないかなぁ……。
基底クラスのメンバ関数が呼ばれるのも広義には委譲の一種なんじゃないかなぁ……。
838デフォルトの名無しさん
2021/05/15(土) 18:35:44.23ID:eIL06kE0 C#のdelegateって、クロージャとかオブジェクトのメソッドをレシーバごと格納できるコレクションだよね
同じ引数と返り値を持っている関数みたいななものならば、なんでも追加できる
そいでその引数と返り値の関数として呼び出すことができる
移譲先を格納しておくのに便利な機能
同じ引数と返り値を持っている関数みたいななものならば、なんでも追加できる
そいでその引数と返り値の関数として呼び出すことができる
移譲先を格納しておくのに便利な機能
839デフォルトの名無しさん
2021/05/15(土) 19:12:47.49ID:ASJTiJTT840デフォルトの名無しさん
2021/05/15(土) 19:25:28.14ID:51m73G+d 委譲とコンポジションってのはオブジェクトの合成方法だ
具体的にはオブジェクトAにオブジェクトBを持たせる
そしてAのメソッドを定義してBのメソッドを呼び出す
具体的にはオブジェクトAにオブジェクトBを持たせる
そしてAのメソッドを定義してBのメソッドを呼び出す
841デフォルトの名無しさん
2021/05/15(土) 20:45:42.10ID:I9hvCSGp 継承先でoverrideした関数があって、継承元の関数使いたくなった場合、何か手段ある?
>>831
しばしお待ちを
しばしお待ちを
843デフォルトの名無しさん
2021/05/15(土) 20:59:13.89ID:l/htYdSr >>841
Base::method()
Base::method()
844デフォルトの名無しさん
2021/05/15(土) 21:02:37.21ID:I9hvCSGp >>843
ありがとう!
ありがとう!
845デフォルトの名無しさん
2021/05/15(土) 21:33:36.92ID:ROEIM7pX 継承は、is-a
委譲は、has-a
内部に部品を持って、その部品にやらせる
最近の言語は、Go, Elixir みたいに継承がない
一方、Ruby on Rails では、継承がめちゃめちゃ便利。
継承して、カスタマイズするだけ
委譲は、has-a
内部に部品を持って、その部品にやらせる
最近の言語は、Go, Elixir みたいに継承がない
一方、Ruby on Rails では、継承がめちゃめちゃ便利。
継承して、カスタマイズするだけ
>>845
そのリスコフ置換原則= is-a が必ずしもいつも使えるとは限らないのですよ
例えば、数の体系は例えば
複素数⊃実数⊃有理数⊃整数⊃自然数
ですが、じゃあ、「複素数」からインプリメントするか?というと、私はそうは思えません
そのリスコフ置換原則= is-a が必ずしもいつも使えるとは限らないのですよ
例えば、数の体系は例えば
複素数⊃実数⊃有理数⊃整数⊃自然数
ですが、じゃあ、「複素数」からインプリメントするか?というと、私はそうは思えません
847デフォルトの名無しさん
2021/05/15(土) 22:02:48.30ID:ROEIM7pX Ruby の委譲は、Forwardable を使う
例えば、自分でスタッククラスを作る場合、
Array 型のインスタンス変数に丸投げして、push/pop を使う
ただし、他のメソッドを呼ばれても困るので、使えるメソッドを限定する
文字列・配列などは継承用のクラスじゃないから、
継承するのはアンチパターンなので、委譲を使う
ただし例外的に、Ruby on Rails など、有名なフレームワークでは、
標準クラスを継承して、カスタマイズする事も認められる
require 'forwardable'
class Stack
extend Forwardable
def initialize( ) @ary = [ ] end
def_delegators( :@ary, :push, :pop )
end
stack = Stack.new
stack.push 1
stack.push 2
stack.pop
p stack #=> @ary=[1]
例えば、自分でスタッククラスを作る場合、
Array 型のインスタンス変数に丸投げして、push/pop を使う
ただし、他のメソッドを呼ばれても困るので、使えるメソッドを限定する
文字列・配列などは継承用のクラスじゃないから、
継承するのはアンチパターンなので、委譲を使う
ただし例外的に、Ruby on Rails など、有名なフレームワークでは、
標準クラスを継承して、カスタマイズする事も認められる
require 'forwardable'
class Stack
extend Forwardable
def initialize( ) @ary = [ ] end
def_delegators( :@ary, :push, :pop )
end
stack = Stack.new
stack.push 1
stack.push 2
stack.pop
p stack #=> @ary=[1]
848デフォルトの名無しさん
2021/05/15(土) 22:42:05.60ID:ACVNfbfy >>826
>STLコンテナの継承って典型的なアンチパターンなんだが
だからおかしなことになると言ってるだろ何をドヤってんだアホかお前は
>レベル低すぎて驚愕
してんのはこっちだ
is-aなら継承、has-aなら委譲(この場合メンバで持つ)が自然だと言ったんだよ
>STLコンテナの継承って典型的なアンチパターンなんだが
だからおかしなことになると言ってるだろ何をドヤってんだアホかお前は
>レベル低すぎて驚愕
してんのはこっちだ
is-aなら継承、has-aなら委譲(この場合メンバで持つ)が自然だと言ったんだよ
>>848
その is-a, has-a は、実際の設計作業にはあまり役にたたない気がします
私がやっている小規模/個人コーディングでは、差分プログラミングを取るしかない(まずプロトタイプを書いてから継承または委譲を使ってテストコードと併用して膨らませていく)わけですが、その記述としては最初に委譲を考えます
実際のところ継承と委譲の使い分けは何でしょうかね、少なくともリスコフ置換原則ではカバーできないという気がしますね
その is-a, has-a は、実際の設計作業にはあまり役にたたない気がします
私がやっている小規模/個人コーディングでは、差分プログラミングを取るしかない(まずプロトタイプを書いてから継承または委譲を使ってテストコードと併用して膨らませていく)わけですが、その記述としては最初に委譲を考えます
実際のところ継承と委譲の使い分けは何でしょうかね、少なくともリスコフ置換原則ではカバーできないという気がしますね
850デフォルトの名無しさん
2021/05/15(土) 23:15:31.28ID:ACVNfbfy >>849
>私がやっている小規模/個人コーディングでは、
>継承または委譲を使ってテストコードと併用して膨らませていく
いつもその条件で部品テストしてるだけならそうだろうなー
すでに言われてるけど違うことやり始めたら考え変わるんじゃね
>私がやっている小規模/個人コーディングでは、
>継承または委譲を使ってテストコードと併用して膨らませていく
いつもその条件で部品テストしてるだけならそうだろうなー
すでに言われてるけど違うことやり始めたら考え変わるんじゃね
851デフォルトの名無しさん
2021/05/15(土) 23:21:48.14ID:ACVNfbfy 個人的には、やっぱり自然かどうか、とか書きやすいかを考えた方が正解だと思うよ(その方が後で破綻しない
そのリスコフ置換原則?も上にあったように数学関係のクラスだと微妙だろうし
そのリスコフ置換原則?も上にあったように数学関係のクラスだと微妙だろうし
852デフォルトの名無しさん
2021/05/15(土) 23:47:22.72ID:cVKO4d9w854デフォルトの名無しさん
2021/05/16(日) 11:33:38.38ID:VxksG9ZS C++ で ifstream で開くファイルが存在するかどうかチェックしたいのですが
ファイル名が utf-8 だと
string hoge = "utf-8のファイル名";
ifstream fuga(hoge);
if(fuga.is_open())
で存在しないと看做されます(全部ASCIIのときとか存在するときもある)
どう対処するのが良いですか?
出来れば Win32API は使いたくありません
ファイル名が utf-8 だと
string hoge = "utf-8のファイル名";
ifstream fuga(hoge);
if(fuga.is_open())
で存在しないと看做されます(全部ASCIIのときとか存在するときもある)
どう対処するのが良いですか?
出来れば Win32API は使いたくありません
855デフォルトの名無しさん
2021/05/16(日) 11:36:10.62ID:pdS2eoPi 使いたくない理由の99%は霧散解消する
胸に手を当てて考えてみればわかる
胸に手を当てて考えてみればわかる
856デフォルトの名無しさん
2021/05/16(日) 11:42:34.85ID:g64uh5fx857デフォルトの名無しさん
2021/05/16(日) 11:42:43.55ID:SJMOKydl filesystem::path ならUTF16のファイル名で渡せる
UTF8をUTF16にする標準機能が非推奨になっているので注意
UTF8をUTF16にする標準機能が非推奨になっているので注意
858デフォルトの名無しさん
2021/05/16(日) 12:03:52.09ID:VxksG9ZS859デフォルトの名無しさん
2021/05/16(日) 12:16:34.49ID:P/WMWyL3 移譲は……
クラスAをクラスBに所有させたとき、Bの公開したいいいメソッドを逐一クラスAにも書かねばならないのがメドイ
public継承なら継承させるだけで済む
タイピング量の削減は継承で解決すべき問題か、というのはあるが現状はそう
クラスAをクラスBに所有させたとき、Bの公開したいいいメソッドを逐一クラスAにも書かねばならないのがメドイ
public継承なら継承させるだけで済む
タイピング量の削減は継承で解決すべき問題か、というのはあるが現状はそう
860デフォルトの名無しさん
2021/05/16(日) 12:17:19.51ID:P/WMWyL3 訂正orz、
誤: クラスAをクラスBに所有させたとき
正: クラスBをクラスAに所有させたとき
誤: クラスAをクラスBに所有させたとき
正: クラスBをクラスAに所有させたとき
861デフォルトの名無しさん
2021/05/16(日) 12:21:21.06ID:mPzmTHCd no_such_method() が C++ にあれば・・・
862デフォルトの名無しさん
2021/05/16(日) 12:41:06.00ID:P/WMWyL3 あとクラスDがクラスBとほぼ共通でBが公開隅でB::foo()を金輪際他の実装を許したくないという3点揃ったケースでは
DをBから継承する他無い
BのインターフェースIBを設けようものならIBを継承してB::foo()の別バージョンを実装してしまうことを阻止できない
DをBから継承する他無い
BのインターフェースIBを設けようものならIBを継承してB::foo()の別バージョンを実装してしまうことを阻止できない
863デフォルトの名無しさん
2021/05/16(日) 14:03:39.16ID:SPtqbmz9 そもそも複素数と実数の例がよくない。
確かに要素としては複素数は実数を含むが演算(特に比較演算)は実数のが広い。
そういう意味で例として間違ってる。
確かに要素としては複素数は実数を含むが演算(特に比較演算)は実数のが広い。
そういう意味で例として間違ってる。
>>863
>複素数は実数を含むが演算(特に比較演算)は実数のが広い。
詳しくお願いいたします
複素数よりも実数の方が「演算が広い」とはどういう意味ですか?
確かに現状は複素数の順序関係はデフォルトで定めていませんが、用途に応じて複素数の順序関係を別途定義すればいいのでは?
例えば複素数の順序関係を複素数の絶対値の大小で定義したっていいのですよ、複素数の範囲での収束を論ずるときにはこれはよくやる手だと私は考えています
>複素数は実数を含むが演算(特に比較演算)は実数のが広い。
詳しくお願いいたします
複素数よりも実数の方が「演算が広い」とはどういう意味ですか?
確かに現状は複素数の順序関係はデフォルトで定めていませんが、用途に応じて複素数の順序関係を別途定義すればいいのでは?
例えば複素数の順序関係を複素数の絶対値の大小で定義したっていいのですよ、複素数の範囲での収束を論ずるときにはこれはよくやる手だと私は考えています
865デフォルトの名無しさん
2021/05/16(日) 14:35:50.91ID:i0aHhWnL866デフォルトの名無しさん
2021/05/16(日) 15:48:44.79ID:i0aHhWnL >>846
>例えば、数の体系は例えば
>複素数⊃実数⊃有理数⊃整数⊃自然数
>ですが、じゃあ、「複素数」からインプリメントするか?というと、私はそうは思えません
なるほどな。
これは初めて聞いた観点。
言われてみればそうかも。
>例えば、数の体系は例えば
>複素数⊃実数⊃有理数⊃整数⊃自然数
>ですが、じゃあ、「複素数」からインプリメントするか?というと、私はそうは思えません
なるほどな。
これは初めて聞いた観点。
言われてみればそうかも。
867デフォルトの名無しさん
2021/05/16(日) 15:53:27.30ID:i0aHhWnL >>866
動物⊃哺乳類⊃犬
動物⊃哺乳類⊃猫
動物⊃哺乳類⊃馬
・・・
だから、
class 動物 {・・・};
class 犬 : public 動物 {・・・};
class 猫 : public 動物 {・・・};
という例は割りと適切だとされているが、
「複素数⊃実数⊃有理数⊃整数⊃自然数」
であるからといって、
class 複素数 { double m_re; double m_im; ・・・};
class 実数 : public 複素数 {・・・};
class 有理数 : public 実数 {・・・};
とは確かに書きにくそうだな。
オブジェクトのサイズから言っても、実数の場合、複素数よりメンバ変数が減らせるわけだし。
動物⊃哺乳類⊃犬
動物⊃哺乳類⊃猫
動物⊃哺乳類⊃馬
・・・
だから、
class 動物 {・・・};
class 犬 : public 動物 {・・・};
class 猫 : public 動物 {・・・};
という例は割りと適切だとされているが、
「複素数⊃実数⊃有理数⊃整数⊃自然数」
であるからといって、
class 複素数 { double m_re; double m_im; ・・・};
class 実数 : public 複素数 {・・・};
class 有理数 : public 実数 {・・・};
とは確かに書きにくそうだな。
オブジェクトのサイズから言っても、実数の場合、複素数よりメンバ変数が減らせるわけだし。
>>867
その例を使って私が主張したいことは
「リスコフの置換原則は参考にする価値があることは認めるが、リスコフだけが基準ではない」
です、どのような時に型の継承を行うのが適切か、という問いの別の基準を探しています
その例を使って私が主張したいことは
「リスコフの置換原則は参考にする価値があることは認めるが、リスコフだけが基準ではない」
です、どのような時に型の継承を行うのが適切か、という問いの別の基準を探しています
870デフォルトの名無しさん
2021/05/16(日) 16:04:14.28ID:i0aHhWnL >>868
x1 < x2 ⇔ x1 - x2 < 0
は一般的に言えるけれど、複素数の場合にこれと同じ法則を成り立つような比較が定義しにくい。
たとえば、あなたが定義したがっているような複素数での比較は、絶対値を採った後の値での比較にするという発想では、
|z1| < |z2| と、|z1 - z2| < 0
が同値ではないから上手く行かない。
x1 < x2 ⇔ x1 - x2 < 0
は一般的に言えるけれど、複素数の場合にこれと同じ法則を成り立つような比較が定義しにくい。
たとえば、あなたが定義したがっているような複素数での比較は、絶対値を採った後の値での比較にするという発想では、
|z1| < |z2| と、|z1 - z2| < 0
が同値ではないから上手く行かない。
871デフォルトの名無しさん
2021/05/16(日) 16:08:32.11ID:z+wHX2Px >>846
リスコフの置換原則は基底と派生型の間に成り立つ規則を定めているだけで順序は関係ないのでは?
あらかじめ実数を基底として実装した型階層に後から新たな基底として複素数を導入する形でも
規則が成り立つならそれでいい気がする。
もちろんリビルドが必要になる場合もあるだろうけどそれは別の話。
リスコフの置換原則は基底と派生型の間に成り立つ規則を定めているだけで順序は関係ないのでは?
あらかじめ実数を基底として実装した型階層に後から新たな基底として複素数を導入する形でも
規則が成り立つならそれでいい気がする。
もちろんリビルドが必要になる場合もあるだろうけどそれは別の話。
872デフォルトの名無しさん
2021/05/16(日) 16:08:45.37ID:i0aHhWnL >>870
[追加]
あなたが考えたような複素数における大小比較の定義が、もし数学的に適切ならば、
複素数の1つである実数に対しては、通常の実数の大小比較に戻らなくてはならない。
ところが、2つの実数 x1, x2 に置いては、
|x1| < |x2|
と
x1 < x2
は同値ではない。だから戻らない。
なので残念ながら不適切と言える。
[追加]
あなたが考えたような複素数における大小比較の定義が、もし数学的に適切ならば、
複素数の1つである実数に対しては、通常の実数の大小比較に戻らなくてはならない。
ところが、2つの実数 x1, x2 に置いては、
|x1| < |x2|
と
x1 < x2
は同値ではない。だから戻らない。
なので残念ながら不適切と言える。
873デフォルトの名無しさん
2021/05/16(日) 16:13:05.98ID:P/WMWyL3 別に
aとbの大小比較は、
a+0iとb+0iの大小比較としてそのまま複素数でも通用する
aとbの大小比較は、
a+0iとb+0iの大小比較としてそのまま複素数でも通用する
874デフォルトの名無しさん
2021/05/16(日) 16:14:49.17ID:P/WMWyL3 ちゅか実数クラスRealから複素数クラスComplexを派生させるという話なのに
Realが複素数の比較演算を備えて居なければならないとする前提がおかいし
Realが複素数の比較演算を備えて居なければならないとする前提がおかいし
875デフォルトの名無しさん
2021/05/16(日) 16:15:39.79ID:6wJymXVG おかいし
876デフォルトの名無しさん
2021/05/16(日) 16:23:25.63ID:ot3D5jQX 一般的に特殊化すると出来ることは増えるんだから別に何もおかしくないだろ
実数は複素数で出来ない大小比較ができる
有理数は実数で出来ない既約分数を求めることができる
自然数は有理数が出来ない素数判定が出来る
それぞれ子クラスにメンバ関数を付け加える事に相当する
実数は複素数で出来ない大小比較ができる
有理数は実数で出来ない既約分数を求めることができる
自然数は有理数が出来ない素数判定が出来る
それぞれ子クラスにメンバ関数を付け加える事に相当する
877デフォルトの名無しさん
2021/05/16(日) 16:26:30.31ID:ot3D5jQX 書き方まずったけど874の言う通りで
子クラスでしかできない比較のインターフェースを複素数に持たせることがおかしい
抽象ストリームクラスにファイル名を取得するインターフェースを持たせるのと同じようにおかしい
子クラスでしかできない比較のインターフェースを複素数に持たせることがおかしい
抽象ストリームクラスにファイル名を取得するインターフェースを持たせるのと同じようにおかしい
878デフォルトの名無しさん
2021/05/16(日) 16:40:43.08ID:i0aHhWnL >>874
しかし、メモリー効率まで考えれば
sizeof(複素数)=sizeof(double) * 2
sizeof(実数)=sizeof(double)
なので、
sizeof(実数) < sizeof(複素数)
なのに、
class 実数 : public 複素数 {・・・}
とすると sizeof(実数) >= sizeof(複素数) に必ずなってしまうという問題が出てくる。
しかし、メモリー効率まで考えれば
sizeof(複素数)=sizeof(double) * 2
sizeof(実数)=sizeof(double)
なので、
sizeof(実数) < sizeof(複素数)
なのに、
class 実数 : public 複素数 {・・・}
とすると sizeof(実数) >= sizeof(複素数) に必ずなってしまうという問題が出てくる。
879デフォルトの名無しさん
2021/05/16(日) 16:47:30.51ID:P/WMWyL3 Realクラスは実数としての単項演算および実数同士の算術演算と比較演算を備えるものとして、
ComplexクラスはRealからComplexへの暗黙の変換(つか単純にコンストラComplex(const Real& src))を備えた上で
複素数の単項演算および複素数同士の算術演算(と必要なら比較演算)を備えたらよろし
まあ特段継承関係にするまでもないかなあという気がしてきたorz
厳密に言ったら虚数単位iを使った実数から複素数への構成的定義はis-a関係ではなくhas-a関係なのでむしろ所有の出番、という見方もできるし、
一方数のクラス、としてみたらReal⊂Complex、なのでRealの方が特殊化という見方もできうる
ぶちゃけ継承するかどうかとは独立に、RealクラスとComplexクラスの自然な共存は上記のように事が済んでしまうということや
ComplexクラスはRealからComplexへの暗黙の変換(つか単純にコンストラComplex(const Real& src))を備えた上で
複素数の単項演算および複素数同士の算術演算(と必要なら比較演算)を備えたらよろし
まあ特段継承関係にするまでもないかなあという気がしてきたorz
厳密に言ったら虚数単位iを使った実数から複素数への構成的定義はis-a関係ではなくhas-a関係なのでむしろ所有の出番、という見方もできるし、
一方数のクラス、としてみたらReal⊂Complex、なのでRealの方が特殊化という見方もできうる
ぶちゃけ継承するかどうかとは独立に、RealクラスとComplexクラスの自然な共存は上記のように事が済んでしまうということや
880デフォルトの名無しさん
2021/05/16(日) 16:48:49.37ID:P/WMWyL3 これが有理数クラスとかだったら普通の人は整数クラス2つを所有するクラスとして設計するであろう、
881デフォルトの名無しさん
2021/05/16(日) 16:52:20.99ID:i0aHhWnL >>874
読み違えていた。
>ちゅか実数クラスRealから複素数クラスComplexを派生させるという話なのに
is_a の関係から考えた OOP の哲学から言えば、逆さまになってしまうということ議論している。
読み違えていた。
>ちゅか実数クラスRealから複素数クラスComplexを派生させるという話なのに
is_a の関係から考えた OOP の哲学から言えば、逆さまになってしまうということ議論している。
882デフォルトの名無しさん
2021/05/16(日) 16:53:00.26ID:i0aHhWnL >>880
なるほどな。
なるほどな。
883デフォルトの名無しさん
2021/05/16(日) 17:04:19.10ID:i0aHhWnL >>873
通常の数学ではそんな定義されてない。
複素数 z の次数部分を Re[z] で表した時、2つの複素数 z1, z2 に
対する比較 z1 > z2 を
Re[z1] > Re[z2]
と定義する方法は可能と言えば可能ではあるが。
しかし、複素数は複素平面上で原点の中心とした回転対象の性質を大体
持っているから、実数だけを特別扱いすることは、余りよくは無い。
(いくつかの一般的性質で破綻が起きる可能性が高い)。
通常の数学ではそんな定義されてない。
複素数 z の次数部分を Re[z] で表した時、2つの複素数 z1, z2 に
対する比較 z1 > z2 を
Re[z1] > Re[z2]
と定義する方法は可能と言えば可能ではあるが。
しかし、複素数は複素平面上で原点の中心とした回転対象の性質を大体
持っているから、実数だけを特別扱いすることは、余りよくは無い。
(いくつかの一般的性質で破綻が起きる可能性が高い)。
884デフォルトの名無しさん
2021/05/16(日) 17:04:53.66ID:i0aHhWnL885デフォルトの名無しさん
2021/05/16(日) 17:05:51.62ID:i0aHhWnL 回転対象 ---> 回転対称
すまん、リアルではややこしいプログラムを考え中だから。
すまん、リアルではややこしいプログラムを考え中だから。
886デフォルトの名無しさん
2021/05/16(日) 17:24:06.95ID:zQRyfSSF 連投やめーや
887デフォルトの名無しさん
2021/05/16(日) 18:29:06.20ID:Ot9k7H7E 学部数学の話をgdgd続けてる奴らは順序体でググってくれ
複素数体に勝手な比較関係はいくらでも入れられるけど(辞書式順序も含めて)、どう入れても算術と両立しないから役に立たないんだよ
プログラム的にはソートのために便宜的な物を入れることはあるだろうが、数学的には無意味
複素数体に勝手な比較関係はいくらでも入れられるけど(辞書式順序も含めて)、どう入れても算術と両立しないから役に立たないんだよ
プログラム的にはソートのために便宜的な物を入れることはあるだろうが、数学的には無意味
>>883
まあ複素数体上でノルムを考えることはあっても広く「使える」全順序を定義するのはむずかしいでしょうね…
ノルムと順序関係を混同していてミスリードを引き起こしていたことは私のせいです、ごめんなさい
まあ複素数体上でノルムを考えることはあっても広く「使える」全順序を定義するのはむずかしいでしょうね…
ノルムと順序関係を混同していてミスリードを引き起こしていたことは私のせいです、ごめんなさい
>>887
数学的に無意味、とか言い切られちゃうとかえって反発したくなりますね…
数学的に無意味、とか言い切られちゃうとかえって反発したくなりますね…
890デフォルトの名無しさん
2021/05/16(日) 18:54:33.03ID:eRJ7ea1d >>889
いや、数学では、対称性や破綻の無さ、一般性などを考慮するので
その意味での「大小関係」は「入れることが不可能」ということを
これまた数学的に証明できる、と彼は言っているのだと思われる。
だから、個人的に意味があると考えても、数学体系としてはダメ
ということ。
いや、数学では、対称性や破綻の無さ、一般性などを考慮するので
その意味での「大小関係」は「入れることが不可能」ということを
これまた数学的に証明できる、と彼は言っているのだと思われる。
だから、個人的に意味があると考えても、数学体系としてはダメ
ということ。
891デフォルトの名無しさん
2021/05/16(日) 18:54:54.54ID:Ot9k7H7E >>889
反発するのは勝手だけど、何をどう入れたってただのR^2の順序にしかならないんだよ、これは数学的に証明された事実
実数ペアと見なした順序でしかないものを無理矢理「Cの順序」と言い張ってどうすんのさ
Cの構造と両立しないのに
反発するのは勝手だけど、何をどう入れたってただのR^2の順序にしかならないんだよ、これは数学的に証明された事実
実数ペアと見なした順序でしかないものを無理矢理「Cの順序」と言い張ってどうすんのさ
Cの構造と両立しないのに
892デフォルトの名無しさん
2021/05/16(日) 18:57:23.87ID:eRJ7ea1d そういえば、二次元の実数を一次元の実数と対応させる事は不可能という証明
があって、順序集合であるためには一次元の実数と対応できないといけない
ことも証明できる、というようなことも関係あるのかな。
があって、順序集合であるためには一次元の実数と対応できないといけない
ことも証明できる、というようなことも関係あるのかな。
893デフォルトの名無しさん
2021/05/16(日) 19:02:48.71ID:Ot9k7H7E だから順序体でググれよ
全然関係ないし、そもそもRとR^2の全単射はあるし(無限集合論の有名な話)
全然関係ないし、そもそもRとR^2の全単射はあるし(無限集合論の有名な話)
894デフォルトの名無しさん
2021/05/16(日) 19:30:05.59ID:eRJ7ea1d895デフォルトの名無しさん
2021/05/16(日) 19:38:32.84ID:eRJ7ea1d 自然数の集合と実数の集合の間には全単写が無く、前者がアレフ_0、
後者がアレフ_1でしたかな。
それと記憶違いしてたかも。
後者がアレフ_1でしたかな。
それと記憶違いしてたかも。
896デフォルトの名無しさん
2021/05/16(日) 19:51:17.83ID:Is982dSx899デフォルトの名無しさん
2021/05/17(月) 03:11:31.73ID:Q7Ttd8P9 余り難しい順序集合とかの事を知らなくても複素数に大小関係が入れられないと数学者が主張していること自体は信じていい。
数学者が「できない」と言った場合、(絶対に)出来無い事が証明された上で言っていることが多く、この場合もそうだから。
数学者が「できない」と言った場合、(絶対に)出来無い事が証明された上で言っていることが多く、この場合もそうだから。
900デフォルトの名無しさん
2021/05/17(月) 03:24:50.61ID:+0j9FXFm しかし実際に証明を確認したわけではない。
でも直感的にわかる。
そもそも上記の議論において、「大小関係が入れられない」として設計の話を続けても全く問題ない。
普通に考えればこうなると思うが。
でも直感的にわかる。
そもそも上記の議論において、「大小関係が入れられない」として設計の話を続けても全く問題ない。
普通に考えればこうなると思うが。
>>899
まあ妥当だとは思いますが、しかし、この場合であってももっとも数学的な態度とは「権威のいうことを疑って証明を調べること」でしょうね、権威のいうことを鵜呑みにすることは数学的ではないと私は思います
まあ妥当だとは思いますが、しかし、この場合であってももっとも数学的な態度とは「権威のいうことを疑って証明を調べること」でしょうね、権威のいうことを鵜呑みにすることは数学的ではないと私は思います
902デフォルトの名無しさん
2021/05/17(月) 08:13:28.70ID:p0CmvUql903デフォルトの名無しさん
2021/05/17(月) 08:17:32.13ID:/XJ4GxVV904デフォルトの名無しさん
2021/05/17(月) 08:27:27.80ID:xbubPeOw なんかごちゃごちゃしているけど……
・複素数の体における比較は未定義
・複素数体に距離の位相を入れて比較を定義することは可能(複素平面など)
と言うことだろ。
まあ、直接比較するのは使い勝手が悪いので、距離の位相には適当な写像を使うのが普通だけど(絶対値とか)。
・複素数の体における比較は未定義
・複素数体に距離の位相を入れて比較を定義することは可能(複素平面など)
と言うことだろ。
まあ、直接比較するのは使い勝手が悪いので、距離の位相には適当な写像を使うのが普通だけど(絶対値とか)。
905デフォルトの名無しさん
2021/05/17(月) 08:31:17.55ID:rt013aFx 複素数は自然な全順序にはならない
特定の条件を満たす順序は存在しない
ってだけで
順序を定義することは可能だし実際定義して使うこともある
特定の条件を満たす順序は存在しない
ってだけで
順序を定義することは可能だし実際定義して使うこともある
906デフォルトの名無しさん
2021/05/17(月) 08:31:35.85ID:pyZ7P5gV 証明にだって厳密さが欠けていることが後からわかった(適用条件が誤っていた)り超ごくまれにだが結論自体誤っていたりしたことが……
ケンペ鎖とか、
あとABC予想の証明ぐらい高度なやつになったら職業数学者であっても査読者の質で
是非を判断せざるおえないハズ
もちろん直接関連論文を書く人は自分が納得するところまできちんと追うだろうがPGがなんでそこまでせねばならんのやヽ(#`Д´)ノ
ケンペ鎖とか、
あとABC予想の証明ぐらい高度なやつになったら職業数学者であっても査読者の質で
是非を判断せざるおえないハズ
もちろん直接関連論文を書く人は自分が納得するところまできちんと追うだろうがPGがなんでそこまでせねばならんのやヽ(#`Д´)ノ
907デフォルトの名無しさん
2021/05/17(月) 08:32:19.32ID:pyZ7P5gV >>905
|z|とかarg(z)とかな
|z|とかarg(z)とかな
908デフォルトの名無しさん
2021/05/17(月) 08:34:34.87ID:pyZ7P5gV やっぱ自然演繹は良くない
あらゆる証明は最初から形式証明にかけるべきや
あらゆる証明は最初から形式証明にかけるべきや
909デフォルトの名無しさん
2021/05/17(月) 08:38:28.10ID:3ODjt5IZ910デフォルトの名無しさん
2021/05/17(月) 08:38:29.82ID:xbubPeOw >>908
そんなにプリンキピア・マテマティカを書きたいか。せめて読破してから言え。
そんなにプリンキピア・マテマティカを書きたいか。せめて読破してから言え。
911デフォルトの名無しさん
2021/05/17(月) 08:40:42.75ID:xbubPeOw912デフォルトの名無しさん
2021/05/17(月) 08:41:59.82ID:3ODjt5IZ913デフォルトの名無しさん
2021/05/17(月) 08:45:32.29ID:3ODjt5IZ 絶対値の大きさ云々の話ならピボット選択は正しく動くだろうな
まあこれは浮動小数点演算の特性からそうなるのであって数学的には関係ない
まあこれは浮動小数点演算の特性からそうなるのであって数学的には関係ない
914デフォルトの名無しさん
2021/05/17(月) 08:46:34.38ID:xbubPeOw915デフォルトの名無しさん
2021/05/17(月) 08:52:16.58ID:3ODjt5IZ916デフォルトの名無しさん
2021/05/17(月) 09:48:48.04ID:p0CmvUql >>915
実装したことないから詳しくないけど、検索したらこんなのあった。
ttps://ameblo.jp/zrfcsctd/entry-10726241960.html
なんか問題あるのかしらん?
実装したことないから詳しくないけど、検索したらこんなのあった。
ttps://ameblo.jp/zrfcsctd/entry-10726241960.html
なんか問題あるのかしらん?
917デフォルトの名無しさん
2021/05/17(月) 10:03:50.08ID:3ODjt5IZ918デフォルトの名無しさん
2021/05/17(月) 11:39:44.96ID:p0CmvUql919デフォルトの名無しさん
2021/05/17(月) 11:39:57.21ID:ZeUb3kXE 2つの複素数 z1, z2 に対して z1 < z2 を |z1| < |z2| と定義してしまうと、
z1, z2 がたまたま(複素数の一部であるところの)実数である場合は、
x1 < x2 が |x1| < |x2| と定義されることになってしまうが、
そうすると、負数の時に通常の実数の比較と結果が違ってきてしまう。
z1, z2 がたまたま(複素数の一部であるところの)実数である場合は、
x1 < x2 が |x1| < |x2| と定義されることになってしまうが、
そうすると、負数の時に通常の実数の比較と結果が違ってきてしまう。
920デフォルトの名無しさん
2021/05/17(月) 12:08:56.20ID:CucgVtNi だから複素数体を順序体にできないことなんて代数の教科書にいくらでも証明載ってるんだから読めよ
いつまでやってんだ
いつまでやってんだ
921デフォルトの名無しさん
2021/05/17(月) 12:09:08.59ID:giSQx4b2 std::locale::global(std::locale("japanese"));
必要ですか?
無くても動いてるときに敢えて描くと可笑しくなりますか?
必要ですか?
無くても動いてるときに敢えて描くと可笑しくなりますか?
922デフォルトの名無しさん
2021/05/17(月) 12:12:10.72ID:cCPUzk2p complexには<=>がないね
923デフォルトの名無しさん
2021/05/17(月) 12:14:40.03ID:+IMuyr7J924デフォルトの名無しさん
2021/05/17(月) 12:29:58.49ID:0hooCSOD >>920
QZがあまりの悔しさにID変えて荒らしてるんだよ
QZがあまりの悔しさにID変えて荒らしてるんだよ
925デフォルトの名無しさん
2021/05/17(月) 13:05:04.47ID:DzXjbqQO926デフォルトの名無しさん
2021/05/17(月) 13:40:20.69ID:AtV47BCw ハンダンセ猿はすばしっこいからな
927デフォルトの名無しさん
2021/05/17(月) 13:54:56.37ID:+0j9FXFm QA分解はそもそも数値誤差を減らすのがめちゃくちゃ難しいからあんま使われんのよ。
特別な事情がない限りは軽はずみに手を出すのはやめた方がいい。
特別な事情がない限りは軽はずみに手を出すのはやめた方がいい。
928デフォルトの名無しさん
2021/05/17(月) 16:56:52.33ID:Hl6gcnGv g++で Member 'x' was not initialized in this constructor
って警告が出るんだが、これをpragmaで抑止したい。
このwarningを抑止するためのキーワードを教えてもらえないだろうか
って警告が出るんだが、これをpragmaで抑止したい。
このwarningを抑止するためのキーワードを教えてもらえないだろうか
929デフォルトの名無しさん
2021/05/17(月) 17:16:13.81ID:cCPUzk2p C++20のコード晒せるところ、どっかある?
ideoneやcodepadはダメだった
ideoneやcodepadはダメだった
930デフォルトの名無しさん
2021/05/17(月) 17:58:51.81ID:v7SqzMPT wandbox
931デフォルトの名無しさん
2021/05/17(月) 18:24:20.71ID:rt013aFx932デフォルトの名無しさん
2021/05/17(月) 18:34:03.64ID:rt013aFx C++的に複素数に順序を取り入れるなら
辞書的順序が一番使われ方として多いかと
コンテナに入れるのに順序が必須な場合とか
std::pair < double, double >
これだって勝手に定義される
C/C++に数学的な汎用性が必須ではないのは
C/C++をやっていればわかると思う
1./-0. < 1./0. とか pow(0,0) = 1 とか数学的には明らかにおかしいでしょ
辞書的順序が一番使われ方として多いかと
コンテナに入れるのに順序が必須な場合とか
std::pair < double, double >
これだって勝手に定義される
C/C++に数学的な汎用性が必須ではないのは
C/C++をやっていればわかると思う
1./-0. < 1./0. とか pow(0,0) = 1 とか数学的には明らかにおかしいでしょ
933デフォルトの名無しさん
2021/05/17(月) 18:51:12.32ID:pyZ7P5gV まあ辞書順は可能だぬ
934デフォルトの名無しさん
2021/05/17(月) 19:28:02.39ID:xbubPeOw >>931
c++のpublic継承は継承先クラスを継承元クラスと同じものとして扱うので、特性の包含性が重要。
なので、失われる特性があるなら継承はしないほうが良い。
上でも挙がっているけど、複素数は実数の全順序性という特性が失われるので継承はしないほうが良い。やるなら無限体を継承元クラスにすべきだわな。
c++のpublic継承は継承先クラスを継承元クラスと同じものとして扱うので、特性の包含性が重要。
なので、失われる特性があるなら継承はしないほうが良い。
上でも挙がっているけど、複素数は実数の全順序性という特性が失われるので継承はしないほうが良い。やるなら無限体を継承元クラスにすべきだわな。
935デフォルトの名無しさん
2021/05/17(月) 19:49:53.27ID:pZGof8k7 >>910
ブルバギじゃなくて?
ブルバギじゃなくて?
936デフォルトの名無しさん
2021/05/17(月) 20:09:19.46ID:FZJkNpOI937デフォルトの名無しさん
2021/05/17(月) 20:11:40.34ID:PX9GndkV 何のスレやねん
938デフォルトの名無しさん
2021/05/17(月) 20:51:22.31ID:pyZ7P5gV >>934
継承したからといって継承元クラスで定義される演算を継承したクラスにも引き継がねばならない理由は無い
演算子のオーバーロードと型変換関連のコンストラクタまたはキャスト演算子を定義したら
同じ演算子に対してパラメータの型毎に許す演算と許さない演算を任意に設定できる
特にComplexクラスからRealクラスを派生させた場合は
(この場合は|z|やarg(z)といった複素数の演算子がReal以外の実数を返すComplexのメソッドとすることになりそうだがそれはおくとして
ある意味話は簡単で、Complex同士のoperator<()の一族を定義せずにおもむろにReal同士でだけ定義するだけにしたらええんじゃ
つか個人的にカナーリ疑問なのですだが、AがBの真部分集合であることと、
Aを表すのクラスとBを表すクラスの継承関係は一体追求すべき何の関係があるん??
継承したからといって継承元クラスで定義される演算を継承したクラスにも引き継がねばならない理由は無い
演算子のオーバーロードと型変換関連のコンストラクタまたはキャスト演算子を定義したら
同じ演算子に対してパラメータの型毎に許す演算と許さない演算を任意に設定できる
特にComplexクラスからRealクラスを派生させた場合は
(この場合は|z|やarg(z)といった複素数の演算子がReal以外の実数を返すComplexのメソッドとすることになりそうだがそれはおくとして
ある意味話は簡単で、Complex同士のoperator<()の一族を定義せずにおもむろにReal同士でだけ定義するだけにしたらええんじゃ
つか個人的にカナーリ疑問なのですだが、AがBの真部分集合であることと、
Aを表すのクラスとBを表すクラスの継承関係は一体追求すべき何の関係があるん??
939デフォルトの名無しさん
2021/05/17(月) 21:58:18.14ID:SfcIGFpx 継承元として振る舞えるのはポリモーフィズムの必須要件じゃない?
親クラスとして振る舞えなくなる子クラスとか存在価値ないでしょ
親クラスとして振る舞えなくなる子クラスとか存在価値ないでしょ
940デフォルトの名無しさん
2021/05/17(月) 22:27:35.19ID:rt013aFx941デフォルトの名無しさん
2021/05/17(月) 22:36:00.22ID:pyZ7P5gV >>939
実数を複素数としてふるまわせたいならRealをComplexに型変換したら済むので継承やポリモーフィズムは必須ではない
>>938の問いに戻るがなんで集合としての包含関係をそう執拗に継承関係に反映させようとするんじゃ……
だいたい実数から複素数を作る演算(|z|とarg(z)で複素数zを作る)もあるし
複素数から実数を作る演算(|z|やarg(z))があるから変換は双方向的なので、
この場合派生クラスから基底クラスへの一方的変換だけでは片手落ちなのは明白
無理矢理やったら>>938に書いたみたく|z|やarg(z)といった複素数の演算子がReal以外の実数を返すみたいなgdgdな話に……
実数を複素数としてふるまわせたいならRealをComplexに型変換したら済むので継承やポリモーフィズムは必須ではない
>>938の問いに戻るがなんで集合としての包含関係をそう執拗に継承関係に反映させようとするんじゃ……
だいたい実数から複素数を作る演算(|z|とarg(z)で複素数zを作る)もあるし
複素数から実数を作る演算(|z|やarg(z))があるから変換は双方向的なので、
この場合派生クラスから基底クラスへの一方的変換だけでは片手落ちなのは明白
無理矢理やったら>>938に書いたみたく|z|やarg(z)といった複素数の演算子がReal以外の実数を返すみたいなgdgdな話に……
942デフォルトの名無しさん
2021/05/17(月) 22:39:11.47ID:rt013aFx943デフォルトの名無しさん
2021/05/17(月) 23:00:01.22ID:hwY+PVbw >>938
>継承したからといって継承元クラスで定義される演算を継承したクラスにも引き継がねばならない理由は無い
さすがに演算が別物レベルで違うのはc++のpublic継承を使うべきじゃない。
public継承は継承元クラスのポインタ変数・参照として使えるという意思表示でもある。使えると言っているのに使えないのはクラスのユーザーを混乱させるし、コンパイラとかからの支援も期待できなくなる。
継承元か継承先かを意識してプログラムしなきゃいけないのは典型的な「継承の危険な使い方」だよ。
>継承したからといって継承元クラスで定義される演算を継承したクラスにも引き継がねばならない理由は無い
さすがに演算が別物レベルで違うのはc++のpublic継承を使うべきじゃない。
public継承は継承元クラスのポインタ変数・参照として使えるという意思表示でもある。使えると言っているのに使えないのはクラスのユーザーを混乱させるし、コンパイラとかからの支援も期待できなくなる。
継承元か継承先かを意識してプログラムしなきゃいけないのは典型的な「継承の危険な使い方」だよ。
944デフォルトの名無しさん
2021/05/17(月) 23:17:51.34ID:hwY+PVbw945デフォルトの名無しさん
2021/05/17(月) 23:39:13.83ID:GYmzER1r 浮動小数と整数は継承関係にない代わりに個別に暗黙変換のルールが作り込まれているわけだから
同列には語れんような。
同列には語れんような。
946デフォルトの名無しさん
2021/05/17(月) 23:53:21.28ID:rt013aFx947デフォルトの名無しさん
2021/05/18(火) 00:42:41.50ID:pJ71QEbf >>946
お前頭悪いって良く言われるっしょ
お前頭悪いって良く言われるっしょ
948デフォルトの名無しさん
2021/05/18(火) 01:40:04.12ID:FUhBCUlD ここまでのアホみたいな流れは全部>>793のクソコードのせいにして終わり終わり
949デフォルトの名無しさん
2021/05/18(火) 02:05:36.55ID:0A1+AcfP >>942
>939 は >938 に反論する形で
継承元(Complex)として振る舞えるのは(Realが満足すべき)ポリモーフィズムの必須要件、
と言っているのだから
>ポリモーフィズムは必須」なんて書いてない
なんて大嘘
>939 は >938 に反論する形で
継承元(Complex)として振る舞えるのは(Realが満足すべき)ポリモーフィズムの必須要件、
と言っているのだから
>ポリモーフィズムは必須」なんて書いてない
なんて大嘘
950デフォルトの名無しさん
2021/05/18(火) 02:07:04.04ID:0A1+AcfP 全く>>946はこの問題でいっぱいレスしている割にガチで頭悪いのではないか
951デフォルトの名無しさん
2021/05/18(火) 06:07:46.07ID:M8tLf7N/952デフォルトの名無しさん
2021/05/18(火) 07:35:31.53ID:iJzvlnxx <=>使ったことないけど==は自分で定義しとかないといかんらしいぞ
あとこれ仮想関数にする必要あるのか疑問(無駄にサイズ増えるし。あと継承もいらん気がする
あとこれ仮想関数にする必要あるのか疑問(無駄にサイズ増えるし。あと継承もいらん気がする
953デフォルトの名無しさん
2021/05/18(火) 07:37:05.89ID:M8tLf7N/ <=>から==を導出させるには=default;しなきゃいけないんだけど
=default;した関数の内容を独自なものにするには
virtualで上書きするくらいしか思いつかない
=default;した関数の内容を独自なものにするには
virtualで上書きするくらいしか思いつかない
954デフォルトの名無しさん
2021/05/18(火) 07:40:16.15ID:iJzvlnxx わからんけど、そのpointの大きさ(内積してsqrt)で比較するようなコードをコンパイラが勝手に作ってくれるのけ
955デフォルトの名無しさん
2021/05/18(火) 07:43:09.23ID:RvkfiLpS メンバの辞書式順序で比較するコードを勝手に作ってくれる
956デフォルトの名無しさん
2021/05/18(火) 07:44:12.47ID:M8tLf7N/ そんなわけないと思うからこそ=default;した関数の内容を独自の内容に変更したい
957デフォルトの名無しさん
2021/05/18(火) 07:45:11.32ID:M8tLf7N/ メンバの辞書式順序と違う定義にはできんの?
958デフォルトの名無しさん
2021/05/18(火) 07:47:15.02ID:iJzvlnxx だから==も書かないといけないんじゃね
多分だけど、そのpointの==は中身point_baseの比較しかしてないんでしょ
多分だけど、そのpointの==は中身point_baseの比較しかしてないんでしょ
959デフォルトの名無しさん
2021/05/18(火) 07:48:24.73ID:M8tLf7N/ 独自の定義にするには == 必須で
<=> から導出させようという考えがそもそも間違い?
<=> から導出させようという考えがそもそも間違い?
960デフォルトの名無しさん
2021/05/18(火) 07:51:58.56ID:iJzvlnxx pointの方で=defaultはうまくいくかもしれんね(今試せないのですまん
961デフォルトの名無しさん
2021/05/18(火) 07:59:32.16ID:M8tLf7N/962デフォルトの名無しさん
2021/05/18(火) 08:24:07.75ID:M8tLf7N/963デフォルトの名無しさん
2021/05/18(火) 11:01:21.48ID:K5WN/Dsi こんなしょうもない例でもこれだけもめるんだから
抽象的な定義をするときは思った以上に概念を共有できないということだな。
抽象的な定義をするときは思った以上に概念を共有できないということだな。
964デフォルトの名無しさん
2021/05/18(火) 11:06:20.67ID:Tj0Ma2DE ンなこと言うんなら最初っからお前が揉めないような定義をバンと出せばいいんじゃないの?
出来ないなら黙ってて
出来ないなら黙ってて
965デフォルトの名無しさん
2021/05/18(火) 11:57:19.66ID:K5WN/Dsi だから揉めないような定義なんかないって主張なんだが。
966デフォルトの名無しさん
2021/05/18(火) 12:05:54.73ID:3kx5cfZQ967デフォルトの名無しさん
2021/05/18(火) 12:43:04.27ID:eJEusld6 UQを含めてC++流のクラスや継承に価値を見出せない人が結構いるようだが
当時、アメリカではCだけでは複数のプログラマによる共同開発に問題が
来たしていて大問題になっていたのがC++の登場で解決したとされているぞ。
どうしてかというと、protected属性などでメンバ変数を「隠蔽」できることで
他の人の作ったパーツを破壊することなく使えることになったことが大きいと
聞いた。もちろん継承もその一つ。
当時、アメリカではCだけでは複数のプログラマによる共同開発に問題が
来たしていて大問題になっていたのがC++の登場で解決したとされているぞ。
どうしてかというと、protected属性などでメンバ変数を「隠蔽」できることで
他の人の作ったパーツを破壊することなく使えることになったことが大きいと
聞いた。もちろん継承もその一つ。
968デフォルトの名無しさん
2021/05/18(火) 13:02:06.01ID:eJEusld6 >>967
継承は、他の人が作ったプログラムに機能を「追加」するときに何が追加された
のかが明確になるので便利。
継承の機能が無ければどの部分が追加されたのか分からないし、
追加した際に元々動作していた基本部分までバグが入る可能性があるが、
継承した場合にはそれが無い。
UQみたいに「委譲」でなんとかするのは、言語機能のサポートが得られないので
記述量が増えてメンドクサイ。
継承は、他の人が作ったプログラムに機能を「追加」するときに何が追加された
のかが明確になるので便利。
継承の機能が無ければどの部分が追加されたのか分からないし、
追加した際に元々動作していた基本部分までバグが入る可能性があるが、
継承した場合にはそれが無い。
UQみたいに「委譲」でなんとかするのは、言語機能のサポートが得られないので
記述量が増えてメンドクサイ。
969デフォルトの名無しさん
2021/05/18(火) 13:33:09.76ID:iJzvlnxx UQってなんやと思ったけどQZのことか
てかまともにソフト書いたことない奴には言ってもわからんと思う
てかまともにソフト書いたことない奴には言ってもわからんと思う
970デフォルトの名無しさん
2021/05/18(火) 16:26:14.79ID:EATlfCml 自衛隊の大規模接種センター(東京センター)は生年月日の入力欄初期値が1970年1月1日なんだが、Unixタイムを意識したのかな?
https://www.vaccine.mrso.jp/
https://www.vaccine.mrso.jp/
971デフォルトの名無しさん
2021/05/18(火) 16:53:11.90ID:LV/0HQIM >>967
一番良かったのは namespace
一番良かったのは namespace
972デフォルトの名無しさん
2021/05/18(火) 16:55:22.83ID:LV/0HQIM >>970
適当な番号でも受付完了するらしいな
受付出来るけど接種に来ても打ってもらえないから
そういう適当なことなしないでくれってアナウンスしてるけど
テロリストにDoSに準じる攻撃方法教えてるようなもんだろ
適当な番号でも受付完了するらしいな
受付出来るけど接種に来ても打ってもらえないから
そういう適当なことなしないでくれってアナウンスしてるけど
テロリストにDoSに準じる攻撃方法教えてるようなもんだろ
973デフォルトの名無しさん
2021/05/18(火) 16:58:39.86ID:nXH1x7Lj 何関係ないこと語り出してんの
974デフォルトの名無しさん
2021/05/18(火) 16:59:15.64ID:EATlfCml 中国のハッカーはHoneypotなのではと警戒してるらしいよ
975デフォルトの名無しさん
2021/05/18(火) 18:41:32.26ID:eJEusld6976デフォルトの名無しさん
2021/05/18(火) 19:04:39.53ID:HX5VOoCQ >>968
それって差分プログラミングじゃないの
それって差分プログラミングじゃないの
977デフォルトの名無しさん
2021/05/18(火) 19:12:29.12ID:lxDAggBF >>976
http://www.ced.is.utsunomiya-u.ac.jp/lecture/2015/prog/p3/kadai3/inherit.php
「継承の機能を使うことにより、すでに定義済みのオブジェクトに
・機能を追加
・変数を追加
・機能の一部を変更
などをエレガントに記述することができるようになり、オブジェクト(コード)の再利用性が向上します。すでに実装済みの機能に、自分が実装したい機能として足りない部分だけを追加してプログラムを作成できるようになりますので、これを差分プログラミングと呼んだりします。」
http://www.ced.is.utsunomiya-u.ac.jp/lecture/2015/prog/p3/kadai3/inherit.php
「継承の機能を使うことにより、すでに定義済みのオブジェクトに
・機能を追加
・変数を追加
・機能の一部を変更
などをエレガントに記述することができるようになり、オブジェクト(コード)の再利用性が向上します。すでに実装済みの機能に、自分が実装したい機能として足りない部分だけを追加してプログラムを作成できるようになりますので、これを差分プログラミングと呼んだりします。」
>>977
それは委譲でも十分で、差分プログラミングだけしたいのなら継承は不要だと私は考えています
>>859
>クラスAをクラスBに所有させたとき、Bの公開したいいいメソッドを逐一クラスAにも書かねばならないのがメドイ
鋭い意見です、唯一共感できるレスポンスだと思いました
確かにおっしゃるとおりですが、しかし、このメンドクサイ手順を踏めば vtable が不要になる、という意味ではメリットの方が大きいと私は思います
あとは基底クラスへのポインタを一括して握っておいて、派生クラスへのポインタごとに仮想メソッドで処理を分け分けする、というのが出来なくなりますが、私はそういう場面で出会ったことがありません……
https://ideone.com/e5NOWO
それは委譲でも十分で、差分プログラミングだけしたいのなら継承は不要だと私は考えています
>>859
>クラスAをクラスBに所有させたとき、Bの公開したいいいメソッドを逐一クラスAにも書かねばならないのがメドイ
鋭い意見です、唯一共感できるレスポンスだと思いました
確かにおっしゃるとおりですが、しかし、このメンドクサイ手順を踏めば vtable が不要になる、という意味ではメリットの方が大きいと私は思います
あとは基底クラスへのポインタを一括して握っておいて、派生クラスへのポインタごとに仮想メソッドで処理を分け分けする、というのが出来なくなりますが、私はそういう場面で出会ったことがありません……
https://ideone.com/e5NOWO
979デフォルトの名無しさん
2021/05/18(火) 22:28:54.13ID:rG13Y8DO 差分プログラミングかー 昔はそんなこと言われてたね
ユーティリティクラスに持つべき共通関数をベースクラスに実装しておけばサブクラスでも簡単に呼べる!とか間違ったクラス設計が横行してた時代
ユーティリティクラスに持つべき共通関数をベースクラスに実装しておけばサブクラスでも簡単に呼べる!とか間違ったクラス設計が横行してた時代
980デフォルトの名無しさん
2021/05/18(火) 22:41:44.49ID:Tj0Ma2DE その時はまだ失敗してなかったんだから「間違ったクラス設計」じゃないんじゃないの
間違ってるのが後からわかったんでしょ
なら間違いの原因は別にある
間違ってるのが後からわかったんでしょ
なら間違いの原因は別にある
981デフォルトの名無しさん
2021/05/19(水) 01:12:06.76ID:fToUWXI/982デフォルトの名無しさん
2021/05/19(水) 01:58:09.30ID:yT7tFlzp >>978
一行目、普通は、C++においては委譲より継承の方が楽に書けるのだから、
C++での差分プログラミングは継承を用いるのが基本で楽なので「継承で十分」と
考えるべきで、C++はそういう設計。
あなたは逆さまで、C++の初期のころからの基本設計に逆らおうとしている。
一行目、普通は、C++においては委譲より継承の方が楽に書けるのだから、
C++での差分プログラミングは継承を用いるのが基本で楽なので「継承で十分」と
考えるべきで、C++はそういう設計。
あなたは逆さまで、C++の初期のころからの基本設計に逆らおうとしている。
983デフォルトの名無しさん
2021/05/19(水) 02:30:36.72ID:kKkrLvTk 継承使わずに委譲って言ってる人はvirtualはどうしてんの?
984デフォルトの名無しさん
2021/05/19(水) 02:32:46.24ID:/jpsBven つーka仕事で使ってないやつによくある感違いだけど
C++にしろ他の言語にしろ、道具であって目的は「トータルとして楽する」ためにすべてはあるので
別にアート作品や哲学やってんじゃねーんだから、「本質的に美しい」とか「こうあるのが正しい」
とかはどうでもいいからな
トータルとして楽にするためには時に面倒な実装や仕組みをつかうこともあるが、結局最終的に
楽できなきゃそんなものに意味はない
C++にしろ他の言語にしろ、道具であって目的は「トータルとして楽する」ためにすべてはあるので
別にアート作品や哲学やってんじゃねーんだから、「本質的に美しい」とか「こうあるのが正しい」
とかはどうでもいいからな
トータルとして楽にするためには時に面倒な実装や仕組みをつかうこともあるが、結局最終的に
楽できなきゃそんなものに意味はない
985はちみつ餃子 ◆8X2XSCHEME
2021/05/19(水) 02:35:39.61ID:ONEwpJm5986デフォルトの名無しさん
2021/05/19(水) 02:45:01.92ID:zjDnGFHC 継承したくないとか言ってる奴らってインターフェースの概念ないバカだけでしょ
987デフォルトの名無しさん
2021/05/19(水) 02:56:09.48ID:iywlut5a virtual は必ず描く
private は使わず protected を使う
private は使わず protected を使う
988デフォルトの名無しさん
2021/05/19(水) 05:27:07.08ID:mqAmVEur 必ずってのもどうかと思うけどな
上にあったpointクラスもそうだけど、メモリ上のサイズがメンバ変数のサイズと一致して欲しい&組み込み型のように配列をmemcpyできるべきクラスなら
無意味にvtblなんか付けるべきじゃない
>>984の言うように楽かどうかもそうだけど、何をユーザーに提供するか、どういう要件が必要なのかと突き詰めていったら最終的に取れる選択肢なんかほとんどない
QZもやはちみつもそうだが、お遊びの長くても数百行のコードしか書いたことないやつは多分それらの部品を何か作るためにまともに年単位で使い倒したことが無いんだろ
それら思いつきで書いた程度のコードは全くブラッシュアップされてないから全く使い物にならんのだが、使ってないからそれに気づかない
実際気付き始めたらあちこち直しまくって膨大な時間使って最後にはゼロから書き直して全く違った設計になると思うが、そうして初めてOOPや継承の利点もわかるんだけどね
上にあったpointクラスもそうだけど、メモリ上のサイズがメンバ変数のサイズと一致して欲しい&組み込み型のように配列をmemcpyできるべきクラスなら
無意味にvtblなんか付けるべきじゃない
>>984の言うように楽かどうかもそうだけど、何をユーザーに提供するか、どういう要件が必要なのかと突き詰めていったら最終的に取れる選択肢なんかほとんどない
QZもやはちみつもそうだが、お遊びの長くても数百行のコードしか書いたことないやつは多分それらの部品を何か作るためにまともに年単位で使い倒したことが無いんだろ
それら思いつきで書いた程度のコードは全くブラッシュアップされてないから全く使い物にならんのだが、使ってないからそれに気づかない
実際気付き始めたらあちこち直しまくって膨大な時間使って最後にはゼロから書き直して全く違った設計になると思うが、そうして初めてOOPや継承の利点もわかるんだけどね
989デフォルトの名無しさん
2021/05/19(水) 05:56:25.62ID:Gyc2jKZQ 可変個の参照の組 (vectorでいい) を関数 hoge
に渡したいときって、hoge が vector< reference_wrapper<T> > を取るようにして
hoge({ref(A), ref(B), ref(C)})
みたいに呼ぶか、可変引数テンプレートを使って hoge の中でパースするかっていうのが普通のやり方かな?
ちょっと冗長な感じがしてしまう
参照の組じゃなくてポインタの組にするとかも手かもしれんが
に渡したいときって、hoge が vector< reference_wrapper<T> > を取るようにして
hoge({ref(A), ref(B), ref(C)})
みたいに呼ぶか、可変引数テンプレートを使って hoge の中でパースするかっていうのが普通のやり方かな?
ちょっと冗長な感じがしてしまう
参照の組じゃなくてポインタの組にするとかも手かもしれんが
990デフォルトの名無しさん
2021/05/19(水) 05:58:41.64ID:LZZifCH2 いきなり継承いらんキリッとかすげえ極論を言い切るやつ
自分の発言に将来にわたってずっと責任を持つ気なさそう
その時のその場だけ俺カッケーできりゃいいってやつ
自分の発言に将来にわたってずっと責任を持つ気なさそう
その時のその場だけ俺カッケーできりゃいいってやつ
991デフォルトの名無しさん
2021/05/19(水) 06:12:15.82ID:mqAmVEur992デフォルトの名無しさん
2021/05/19(水) 06:57:23.69ID:LZZifCH2 conceptでできそうだな
まだ試してないけど
まだ試してないけど
993デフォルトの名無しさん
2021/05/19(水) 07:09:43.82ID:CHs6khMr >>990
継承イランといってる奴なんていなくね? QZは怪しいが...
継承が適切な箇所なら継承を使う、機能追加で差分のコードが少なくてすむからという理由だけでは必ずしも使わない(その場合に継承が適切な関係ならば使う、そうでないなら委譲なりなんなり他の設計にする)ということを言ってるだけでないの?
継承イランといってる奴なんていなくね? QZは怪しいが...
継承が適切な箇所なら継承を使う、機能追加で差分のコードが少なくてすむからという理由だけでは必ずしも使わない(その場合に継承が適切な関係ならば使う、そうでないなら委譲なりなんなり他の設計にする)ということを言ってるだけでないの?
994デフォルトの名無しさん
2021/05/19(水) 07:14:47.97ID:LZZifCH2995デフォルトの名無しさん
2021/05/19(水) 08:07:05.32ID:iIq+id16 継承いらないっていうのはこういうことだろ?
インターフェースは継承するが、クラスは継承しない
クラスを継承するようなことをしたい場合には、メンバー変数としてクラスのオブジェクト持って、それへ処理を移譲する
今時のオブジェクト指向プログラミングでは、わりと常識的な概念だと思うが
インターフェースは継承するが、クラスは継承しない
クラスを継承するようなことをしたい場合には、メンバー変数としてクラスのオブジェクト持って、それへ処理を移譲する
今時のオブジェクト指向プログラミングでは、わりと常識的な概念だと思うが
996デフォルトの名無しさん
2021/05/19(水) 08:42:40.77ID:mqAmVEur >インターフェースは継承する
いるやん
>クラスを継承するようなことをしたい場合
その場合C++的には素直に継承した方が上手くいくと思うけどな(D&Eで禿が言ってたが、継承を全部委譲に置き換えるというのをやってみたらしいが「結果はひどいものだった」と
普通に継承してうまく行かんか破綻するなら、そもそも継承的なことを考えてはならない関係だと思うけどね
いるやん
>クラスを継承するようなことをしたい場合
その場合C++的には素直に継承した方が上手くいくと思うけどな(D&Eで禿が言ってたが、継承を全部委譲に置き換えるというのをやってみたらしいが「結果はひどいものだった」と
普通に継承してうまく行かんか破綻するなら、そもそも継承的なことを考えてはならない関係だと思うけどね
997デフォルトの名無しさん
2021/05/19(水) 08:55:25.03ID:IMMR+vsB 継承いる!に飛びついた連中も
その後の流れで
継承要らない!に飛びついた連中も
本質的には同じなんよ
周回遅れで誰かの後追いするマシーンなんよ
その後の流れで
継承要らない!に飛びついた連中も
本質的には同じなんよ
周回遅れで誰かの後追いするマシーンなんよ
998デフォルトの名無しさん
2021/05/19(水) 09:06:07.34ID:RuJgA5Em インターフェースは実装するって言うでしょ
C++的にはどっちも継承だけど
C++的にはどっちも継承だけど
999デフォルトの名無しさん
2021/05/19(水) 09:53:52.51ID:LZZifCH21000デフォルトの名無しさん
2021/05/19(水) 10:07:56.64ID:iIq+id16 Kotlinちゃんは甘いです
インターフェースを継承し、コンストラクタで渡されたオブジェクトへそのインターフェースの実装を委譲するのを、1行で書ける
https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/delegation.html
インターフェースを継承し、コンストラクタで渡されたオブジェクトへそのインターフェースの実装を委譲するのを、1行で書ける
https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/delegation.html
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 55日 22時間 0分 41秒
新しいスレッドを立ててください。
life time: 55日 22時間 0分 41秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 高市内閣「支持」64%「不支持」19% NHK世論調査 ★2 [少考さん★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 高市首相「多様なコメの増産を進める」 方針転換への懸念払拭狙いか ★2 [どどん★]
- 【速報】気象庁がマグニチュード7.5に修正しました [ニョキニョキ★]
- ぺこーら、地震で同僚が次々配信を止めるなか強行し続けるので悪目立ちするwww [268244553]
- 巨大地震 [957955821]
- 【🏡】岩手ビックウェーブ🏄うおおおおおおおおおおお🌊
- 【速報】高市早苗、起床 [779938112]
- 日本ほど隣国ガチャが失敗した国、ないwwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 久しぶりにヒカキンのチャンネル確認しに行ったら
