C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part149
https://mevius.5ch.net/test/read.cgi/tech/1581974381/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
テンプレここまで
C++相談室 part150
■ このスレッドは過去ログ倉庫に格納されています
2020/03/24(火) 00:04:33.93ID:YFRNwZnv
失礼
×bool c = NaN != NaN の値は true でした。
○bool d = NaN != NaN の値は true でした。
訂正箇所は他にはなく、「a == b が false ならば a != b true であることは、double a, b が NaN であってもいえる」
×bool c = NaN != NaN の値は true でした。
○bool d = NaN != NaN の値は true でした。
訂正箇所は他にはなく、「a == b が false ならば a != b true であることは、double a, b が NaN であってもいえる」
2020/03/28(土) 23:03:59.81ID:TAn8n6A3
3/14は円周率の日
とくに2015年はアメリカ式日付表記で3/14/15なので100年に1回だったという、
■ Googleの円周率31兆4000億桁までの計算について、きちんと解説
https://www.blog.umentu.work/google-circle-3-14/
■ 多倍長計算の技法(3章)
http://www.kurims.kyoto-u.ac.jp/~ooura/pi04.pdf
とくに2015年はアメリカ式日付表記で3/14/15なので100年に1回だったという、
■ Googleの円周率31兆4000億桁までの計算について、きちんと解説
https://www.blog.umentu.work/google-circle-3-14/
■ 多倍長計算の技法(3章)
http://www.kurims.kyoto-u.ac.jp/~ooura/pi04.pdf
2020/03/28(土) 23:04:23.60ID:TAn8n6A3
誤爆すたorz
2020/03/29(日) 00:16:32.66ID:t2YV962W
江添のことはほっといてやれよ。。
2020/03/29(日) 01:26:13.46ID:sawiSEmu
>>23-24 少しでも被害者を減らすために issue 立てといてもらえませんかね?
2020/03/29(日) 01:55:28.30ID:tSgWoZoj
村上原野が死亡。
Sprout はど〜なっちゃうの〜
Sprout はど〜なっちゃうの〜
30デフォルトの名無しさん
2020/03/29(日) 01:57:11.38ID:KAJzXRPk デザインパターンのブリッジパターンやストラテジパターンのようなケースで
インターフェースクラスを継承して実装クラスを作る場合、
class If() /* interface */
{
public:
If() {}
virtual ~If*( {}
virtual void func() {}
};
class Impl() : public If
{
public:
Impl() {}
~Impl() {}
void func() {}
};
のようにすると思いますが、Implクラスをさらに基底クラス(ImplBase)と2種類の派生クラス(ImplA, ImplB)に分けたい場合、
多重継承以外でやるには、どうするのが良いでしょうか?
まず If を ImplBase に継承させて、次に ImplBase を ImplA と ImplB に継承させる事になるでしょうか?
その場合、純粋仮想関数func()はどのように書くべきでしょうか? ImplBase も virtual void func()としておいて
ImplA で実装するのでしょうか?
インターフェースクラスを継承して実装クラスを作る場合、
class If() /* interface */
{
public:
If() {}
virtual ~If*( {}
virtual void func() {}
};
class Impl() : public If
{
public:
Impl() {}
~Impl() {}
void func() {}
};
のようにすると思いますが、Implクラスをさらに基底クラス(ImplBase)と2種類の派生クラス(ImplA, ImplB)に分けたい場合、
多重継承以外でやるには、どうするのが良いでしょうか?
まず If を ImplBase に継承させて、次に ImplBase を ImplA と ImplB に継承させる事になるでしょうか?
その場合、純粋仮想関数func()はどのように書くべきでしょうか? ImplBase も virtual void func()としておいて
ImplA で実装するのでしょうか?
2020/03/29(日) 02:19:11.85ID:p3fh4h77
constexprの中二女子亡くなってたのか・・・
2020/03/29(日) 02:26:21.63ID:p3fh4h77
2020/03/29(日) 08:26:45.65ID:zFUy7lJg
>>29
え、持病でもあったの?
え、持病でもあったの?
2020/03/29(日) 09:05:51.82ID:GFdzppn9
中二で死ぬって早すぎないか
2020/03/29(日) 10:02:27.83ID:+/sFre8I
>>23
NaNが「不定」を意味するなら、理論的には
> // false
> bool c = NaN == NaN ;
> bool d = NaN != NaN ;
が正しいんだろう
仕様は上のようになってて、実装依存ということはないか?
NaNが「不定」を意味するなら、理論的には
> // false
> bool c = NaN == NaN ;
> bool d = NaN != NaN ;
が正しいんだろう
仕様は上のようになってて、実装依存ということはないか?
2020/03/29(日) 10:26:02.28ID:zyhHBMyS
NaNとの!=以外の比較演算は常にfalse、!=は常にtrue
ってするのが普通みたいだけど
ってするのが普通みたいだけど
2020/03/29(日) 10:36:40.12ID:oQB7eLYm
そもそも非数に「等しい」なんて場合があるのか?
数学的におかしくね?
数学的におかしくね?
2020/03/29(日) 10:49:11.16ID:+/sFre8I
本来は「非数」なら「等しくない」も議論できない気がするのでなんとも
0/0->NaNなら「不定」と解釈してもおかしくないし、その場合、
NaN!=NaNは「ほとんどの場合に正しい」としか言えない
0/0->NaNなら「不定」と解釈してもおかしくないし、その場合、
NaN!=NaNは「ほとんどの場合に正しい」としか言えない
2020/03/29(日) 11:12:19.09ID:CNNBvMSR
!=は==の否定だから、NaN == NaNはfalseなので
NaN != NaN -> !(NaN == NaN) はtrue
ほかの等値比較の意味論に合わせてるんだと
NaN != NaN -> !(NaN == NaN) はtrue
ほかの等値比較の意味論に合わせてるんだと
2020/03/29(日) 11:22:58.32ID:sawiSEmu
>>35
std::numeric_limits<T>::is_iec559 (IEEE 754) の場合は NaN!=NaN に定まる模様。
https://stackoverflow.com/questions/38798791/nan-comparison-rule-in-c-c
> I read the IEEE-754 rules on NaN, which states:
>> The comparisons EQ, GT, GE, LT, and LE, when either or both operands is NaN returns FALSE.
>> The comparison NE, when either or both operands is NaN returns TRUE.
C++の規定はこう。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf [expr.eq]
(C++14でも同じ https://timsong-cpp.github.io/cppwp/n4140/expr.eq#5 )
> If two operands compare equal, the result is true for the == operator
> and false for the != operator. If two operands compare unequal,
> the result is false for the == operator and true for the != operator.
> Otherwise, the result of each of the operators is unspecified.
これだけなら「equalでもunequalでもない」として結果を不定とする実装もあり得る。
ただしCの規定には以下のものがある。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2454.pdf Equality operators
> The == (equal to) and != (not equal to) operators are ...
> For any pair of operands, exactly one of the relations is true.
これによれば NaN==NaN, NaN!=NaN を両方 false とするCの実装は許されない。
わざわざこれに反するようなC++の実装が作られる理由は無さそうだし、受け入れられることも無さそう。
std::numeric_limits<T>::is_iec559 (IEEE 754) の場合は NaN!=NaN に定まる模様。
https://stackoverflow.com/questions/38798791/nan-comparison-rule-in-c-c
> I read the IEEE-754 rules on NaN, which states:
>> The comparisons EQ, GT, GE, LT, and LE, when either or both operands is NaN returns FALSE.
>> The comparison NE, when either or both operands is NaN returns TRUE.
C++の規定はこう。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf [expr.eq]
(C++14でも同じ https://timsong-cpp.github.io/cppwp/n4140/expr.eq#5 )
> If two operands compare equal, the result is true for the == operator
> and false for the != operator. If two operands compare unequal,
> the result is false for the == operator and true for the != operator.
> Otherwise, the result of each of the operators is unspecified.
これだけなら「equalでもunequalでもない」として結果を不定とする実装もあり得る。
ただしCの規定には以下のものがある。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2454.pdf Equality operators
> The == (equal to) and != (not equal to) operators are ...
> For any pair of operands, exactly one of the relations is true.
これによれば NaN==NaN, NaN!=NaN を両方 false とするCの実装は許されない。
わざわざこれに反するようなC++の実装が作られる理由は無さそうだし、受け入れられることも無さそう。
2020/03/29(日) 13:05:33.90ID:0VKwdtls
ieee754の書き方が難しすぎて何処をどう読めばNaN!=NaNになるのか分からん…
2020/03/29(日) 13:28:15.35ID:oQB7eLYm
現実は>>39なんだろうけど
原理主義的にはNaNの比較は例外を投げるべき
原理主義的にはNaNの比較は例外を投げるべき
43デフォルトの名無しさん
2020/03/29(日) 13:57:09.44ID:vg0TAzW0 NaNを無限と言い換えて数学的な議論をするしかない
2020/03/29(日) 15:32:11.50ID:nDbo81n4
みんな大好き超準解析、
2020/03/29(日) 15:32:36.22ID:CNNBvMSR
2020/03/29(日) 16:10:11.53ID:p3fh4h77
江添が悪い
たぶんx==xが常に真になるとは限らない(xがNaNの場合)って話を間違えて覚えてたんだろ
たぶんx==xが常に真になるとは限らない(xがNaNの場合)って話を間違えて覚えてたんだろ
2020/03/29(日) 17:54:48.32ID:oQB7eLYm
江添氏はブログを立てて不特定多数の一般人からの指摘を待っている
誤りの指摘はそこでやれ、それが「被害者を減らす」ことにつながる
江添が見ている保証のないこんなところで正義面しても
そういう筋が何もわかっちゃいないやつというだけだ
誤りの指摘はそこでやれ、それが「被害者を減らす」ことにつながる
江添が見ている保証のないこんなところで正義面しても
そういう筋が何もわかっちゃいないやつというだけだ
51はちみつ餃子 ◆8X2XSCHEME
2020/03/29(日) 18:27:59.62ID:tSgWoZoj 本当に間違っているという確信がなくて事前に相談するってのならまあそれもいいんじゃないの。
52デフォルトの名無しさん
2020/03/29(日) 18:41:01.14ID:xWXht+2h 江添さんに聞くのが一番速い。
2020/03/29(日) 22:23:18.41ID:6MT5MhMu
ここ見てそうだしな
2020/03/30(月) 00:19:48.36ID:DkauJosI
あの人もうスノボに夢中でC++に興味なさそう
2020/03/30(月) 01:01:09.51ID:PZnOEjGK
C++なんかやってるのにスノボもやってるのか異端だな
2020/03/30(月) 09:52:17.47ID:6jBFblvz
githubのissue放置してるじゃん
2020/03/30(月) 13:41:16.50ID:hh56tBZl
ベクトルが二つあって重複部分を差分取得になるように結合したいです
in
1,2,3,4
3,4,5,6
out
1,2,3,4,5,6
重複がなければそのまま結合でいいです
in
1,2,3,4
3,4,5,6
out
1,2,3,4,5,6
重複がなければそのまま結合でいいです
58デフォルトの名無しさん
2020/03/30(月) 19:24:54.69ID:ubfGsS+F std::sort
std::unique
std::set_union
std::unique
std::set_union
2020/03/30(月) 19:28:43.95ID:Oymj8mf6
>>57
その程度なら、ネットで検索して見つからないようなら、手で書いたほうが早いね。
2つの列を共にソートしたあと、マージソートの様に左端から順に比較して同じなら
1つ分だけ dest にコピーするようにすれば良いだけ。
その程度なら、ネットで検索して見つからないようなら、手で書いたほうが早いね。
2つの列を共にソートしたあと、マージソートの様に左端から順に比較して同じなら
1つ分だけ dest にコピーするようにすれば良いだけ。
2020/03/30(月) 19:44:49.89ID:UMPMfaDu
標準委員から無視されていじけてるんだろう。ショーもねー奴だよ。
2020/03/31(火) 00:16:01.43ID:FylkZaNQ
new, deleteとか手動でやるのはもう古すぎて使わない?スマートポインタ使うのが普通?
2020/03/31(火) 01:00:25.49ID:oKg2nb+1
必要な時は使えばいいと思うけど自分は全く使わなくなった
2020/03/31(火) 01:34:17.99ID:s0jfH2wf
初めてクラスを使ったのですが、forループの中で関数のように使う場合には
1. 毎回デフォルトコンストラクタに引数を食わせて初期化してからgetterで計算する
2. 初期化はループの外でして置いてループ内ではsetterなどで引数を読み込ませてからgetterで計算する
どちらの方が良いんですかね?
あと、あるメンバ変数に連動したメンバ変数みたいなものって作れますか?
int _a
int _b = _a / 2みたいなものです
1. 毎回デフォルトコンストラクタに引数を食わせて初期化してからgetterで計算する
2. 初期化はループの外でして置いてループ内ではsetterなどで引数を読み込ませてからgetterで計算する
どちらの方が良いんですかね?
あと、あるメンバ変数に連動したメンバ変数みたいなものって作れますか?
int _a
int _b = _a / 2みたいなものです
2020/03/31(火) 01:43:07.29ID:oKg2nb+1
後半の方はint getHalfA()みたいなメンバ関数を設ければいい
前半は関数オブジェクトのこと?何言ってんのかわからん
前半は関数オブジェクトのこと?何言ってんのかわからん
2020/03/31(火) 03:22:08.29ID:Yt3qMdaP
>>63
1,2は、速度面以外ではどちらでもいいが、速度を重視するなら2。
なお、getter, setter は元々、巨大なプログラムでバグを減らすために発明されたようなものだから、小さいプログラムでは特に使う必要は無い。
1,2は、速度面以外ではどちらでもいいが、速度を重視するなら2。
なお、getter, setter は元々、巨大なプログラムでバグを減らすために発明されたようなものだから、小さいプログラムでは特に使う必要は無い。
2020/03/31(火) 03:28:43.09ID:Yt3qMdaP
>>65
C#では、getter, setter を凄く高頻度で使ってもいいような設計思想なのかもしれないが、かなり意見が分かれるところ。
クラスを保護する目的では使っても良いが、普通の代入とは動作を変えてしまいすぎる
ようなものは想定した動作との勘違いによる逆にバグの元になる可能性があるのでお勧めしない。
使い道があるのは、代入箇所や読み取り箇所の動作の変更を手作業や grep 置換に頼らずに確実に行いたいような場合だと思うが、小規模なプログラムでは単純に手作業や grep 置換で直した方がよい。
新しい機能は大宣伝されるので初心者が飛び付きがちだが、実は余り普段は使わないほうが良い機能であることもかなり多いので注意。
C#では、getter, setter を凄く高頻度で使ってもいいような設計思想なのかもしれないが、かなり意見が分かれるところ。
クラスを保護する目的では使っても良いが、普通の代入とは動作を変えてしまいすぎる
ようなものは想定した動作との勘違いによる逆にバグの元になる可能性があるのでお勧めしない。
使い道があるのは、代入箇所や読み取り箇所の動作の変更を手作業や grep 置換に頼らずに確実に行いたいような場合だと思うが、小規模なプログラムでは単純に手作業や grep 置換で直した方がよい。
新しい機能は大宣伝されるので初心者が飛び付きがちだが、実は余り普段は使わないほうが良い機能であることもかなり多いので注意。
67デフォルトの名無しさん
2020/03/31(火) 08:10:50.56ID:Zjo4xAEk2020/03/31(火) 10:02:16.71ID:OTxurRkT
>>63
そういう問題を自分が求めるパフォーマンスレベルに最適化できる(やらなきゃならん)のがc++だぞ。
そういう問題を自分が求めるパフォーマンスレベルに最適化できる(やらなきゃならん)のがc++だぞ。
69はちみつ餃子 ◆8X2XSCHEME
2020/03/31(火) 10:16:06.05ID:Ow5tuxOJ >>63
デフォルトコンストラクタは引数をとらないコンストラクタのことなのでなんか勘違いしてるぞ。
実行コストか抽象化の都合でどうしても事前にしなければならないことがあるなら 2 の選択肢しかないし、
そうでないときはクラスにする意味がないので普通の関数で書けばよくねって思う。
そのふたつの選択肢の間で迷わなければならない場面というのが既になんかおかしい状態に入り込んでる気がする。
デフォルトコンストラクタは引数をとらないコンストラクタのことなのでなんか勘違いしてるぞ。
実行コストか抽象化の都合でどうしても事前にしなければならないことがあるなら 2 の選択肢しかないし、
そうでないときはクラスにする意味がないので普通の関数で書けばよくねって思う。
そのふたつの選択肢の間で迷わなければならない場面というのが既になんかおかしい状態に入り込んでる気がする。
2020/03/31(火) 10:34:43.57ID:6MgwCPiX
c++使いなら速度を追求しろ
速度こそ正義だ
速度こそ正義だ
2020/03/31(火) 12:31:40.67ID:b6kPBFRe
72デフォルトの名無しさん
2020/03/31(火) 12:39:27.67ID:tVRDD1dz おい、パフュームはコーディング捗るぞ。
2020/03/31(火) 14:18:42.21ID:PMv8PBMm
なんか前提条件抜きで「こう書くのが良い」みたいな答えを求める初心者が最近多いっぽいな
セオリーに従順といえば聞こえはいいが、自分のおかれてる状況でどうすべきかの決断をとことんサボろうとしてるとも言える
セオリーに従順といえば聞こえはいいが、自分のおかれてる状況でどうすべきかの決断をとことんサボろうとしてるとも言える
2020/03/31(火) 14:28:08.91ID:daGoeiYK
>>71
「C#はABI互換するのが作法」
という意味が分からないので詳しく。
個人的には、C#でgetter,setterが作り易くなっているのは、HTMLの「property」
を操作するJSの流儀にルーツを持つのではないかと思っている。
そう思う理由の一つは、WinFormsでも、イベントハンドラ(関数)を登録するのに、インスタンス変数に関数の名前を代入するような形式を使っているのが、JSのイベントハンドらの作法にそっくりだし、
Formのフラグ類の設定方法が、HTMLのpropertyやCSSのstyleの設定方法とそっくりだから。
普通、C++だとメンバ関数を通じてオブジェクトに「命令を出す」事でオブジェクトの状態を変える
作法が取られることが多いが、JSだと同じ事をpropertyを設定することで行う。
後者の場合、propertyを設定したら、イベント終了後にDOM要素が自動的にその変化が反映される。
JSのその作法はコードを短く書くのには適してはいるが、インタプリタ的な動作でも有り、
変数の代入のように見える書き方に「副作用」が伴うのがC/C++言語の文化だとちょっと違和感を感じる
人も居ると思う。
「C#はABI互換するのが作法」
という意味が分からないので詳しく。
個人的には、C#でgetter,setterが作り易くなっているのは、HTMLの「property」
を操作するJSの流儀にルーツを持つのではないかと思っている。
そう思う理由の一つは、WinFormsでも、イベントハンドラ(関数)を登録するのに、インスタンス変数に関数の名前を代入するような形式を使っているのが、JSのイベントハンドらの作法にそっくりだし、
Formのフラグ類の設定方法が、HTMLのpropertyやCSSのstyleの設定方法とそっくりだから。
普通、C++だとメンバ関数を通じてオブジェクトに「命令を出す」事でオブジェクトの状態を変える
作法が取られることが多いが、JSだと同じ事をpropertyを設定することで行う。
後者の場合、propertyを設定したら、イベント終了後にDOM要素が自動的にその変化が反映される。
JSのその作法はコードを短く書くのには適してはいるが、インタプリタ的な動作でも有り、
変数の代入のように見える書き方に「副作用」が伴うのがC/C++言語の文化だとちょっと違和感を感じる
人も居ると思う。
2020/03/31(火) 14:39:26.00ID:daGoeiYK
>>74
なお個人的には、
C#のような自動化された setter, getter を使うより、
void SetXxx(TYPE x); や TYPE GetXxx();
を明示的に使ったほうが、set, get している場所をgrep検索し易いと思う。
xxx = yyy で settter を呼び出す作法の場合、grep検索するなら、
正規表現で xxx*s\= などと書く必要があるし、コンストラクタで
使われている場合や関数の引数に「代入」されている場合にはこれでは検索しきれない。
自動化されることで使用箇所が見えにくくなり、トラブルの元になる可能性がある。
getterの方は使用箇所の検索は不可能になる。
なお個人的には、
C#のような自動化された setter, getter を使うより、
void SetXxx(TYPE x); や TYPE GetXxx();
を明示的に使ったほうが、set, get している場所をgrep検索し易いと思う。
xxx = yyy で settter を呼び出す作法の場合、grep検索するなら、
正規表現で xxx*s\= などと書く必要があるし、コンストラクタで
使われている場合や関数の引数に「代入」されている場合にはこれでは検索しきれない。
自動化されることで使用箇所が見えにくくなり、トラブルの元になる可能性がある。
getterの方は使用箇所の検索は不可能になる。
2020/03/31(火) 14:42:36.42ID:DEnjdkJH
C#はC++と違ってシンボルの完璧な静的解決が可能だからgrep性なんかどうでもいいんだよ
VSでポチポチしたら一瞬で完全な呼び出しツリーが出来上がる
VSでポチポチしたら一瞬で完全な呼び出しツリーが出来上がる
2020/03/31(火) 15:09:58.10ID:OTxurRkT
>>73
プログラマは怠惰であるべきってのを間違ったとらえ方してるバカは世の中には多い。
プログラマは怠惰であるべきってのを間違ったとらえ方してるバカは世の中には多い。
2020/03/31(火) 15:12:48.63ID:YcGHsuX6
>>75
メモ帳でコード書いてるのか?w
メモ帳でコード書いてるのか?w
79デフォルトの名無しさん
2020/03/31(火) 17:49:17.43ID:tVRDD1dz viでは。
2020/03/31(火) 20:44:47.09ID:HDRrREDo
【速報】東京都が #新型コロナウイルス 感染症死亡者数を過少評価か、
「例年より少ない」とされていたインフルエンザ関連死が急増=国立感染症研究所
https://www.niid.go.jp/niid/ja/flu-m/2112-idsc/jinsoku/1852-flu-jinsoku-7.html …
コロナで死んだのインフルに振り替えてるんじゃまいか
こういうニュースが出てくる時点で隠蔽はもう無理
おそらくパンデミックは避けられないと思うね
「例年より少ない」とされていたインフルエンザ関連死が急増=国立感染症研究所
https://www.niid.go.jp/niid/ja/flu-m/2112-idsc/jinsoku/1852-flu-jinsoku-7.html …
コロナで死んだのインフルに振り替えてるんじゃまいか
こういうニュースが出てくる時点で隠蔽はもう無理
おそらくパンデミックは避けられないと思うね
2020/03/31(火) 22:00:06.46ID:ox5sQqez
言語仕様はメモ帳で書く場合を想定すべき
メモ帳で楽に書ければ開発環境でも楽に書けるが、逆はない
開発環境がなければ書けないような構文は構文自体おかしいと認識するべきだ
メモ帳で楽に書ければ開発環境でも楽に書けるが、逆はない
開発環境がなければ書けないような構文は構文自体おかしいと認識するべきだ
2020/03/31(火) 22:01:35.88ID:L/5UA51D
なぜメモ帳?
そこはedlinだろ?
そこはedlinだろ?
83デフォルトの名無しさん
2020/03/31(火) 22:05:49.04ID:tVRDD1dz Excelよく使ってる。
84デフォルトの名無しさん
2020/03/31(火) 22:07:47.94ID:tVRDD1dz ExcelはExtended cellという意味とExcellentという意味がある。
と思う。
と思う。
85デフォルトの名無しさん
2020/03/31(火) 22:14:04.53ID:tVRDD1dz 電卓にはプログラマ・モードがあるのに。
Excelにはない。
不思議な話だ。
Excelにはない。
不思議な話だ。
86デフォルトの名無しさん
2020/03/31(火) 22:14:37.75ID:tVRDD1dz そういえば電卓も良く使う。
2020/03/31(火) 22:19:10.66ID:L/5UA51D
そりゃmac用ソフトだもの
2020/03/31(火) 22:52:39.00ID:s0jfH2wf
皆さんありがとうございます
正直個人で利用するだけなら関数でいいし今までも関数で済ましてたんですが、他人に教えるときに変数定義などが散らばってると教えるのが面倒くさいという理由でクラス化したんですよね
正直個人で利用するだけなら関数でいいし今までも関数で済ましてたんですが、他人に教えるときに変数定義などが散らばってると教えるのが面倒くさいという理由でクラス化したんですよね
2020/03/31(火) 23:13:13.12ID:W8+rJJar
関数で済むならその方が良い
プログラムが複雑な動作ができるのは「状態(=変数)」を持つから
単純にできるならその方が良い
変数は悪だよ、必要悪
プログラムが複雑な動作ができるのは「状態(=変数)」を持つから
単純にできるならその方が良い
変数は悪だよ、必要悪
2020/04/01(水) 08:43:31.52ID:BVkSt5Rw
class変数ってのはstatic変数とlocal変数の中間的なイメージをもってる。
static変数よりかマシだけど状態を持つことには変わりはない。
まあlocal変数だけでプログラムするのもつらいって場面も多いけど。
static変数よりかマシだけど状態を持つことには変わりはない。
まあlocal変数だけでプログラムするのもつらいって場面も多いけど。
2020/04/01(水) 13:47:46.62ID:PC8mhvaW
気になったので教えて
c++的に関数のbool型戻り値に関数の成功失敗返すとして、真が成功で偽が失敗が一般的?
c言語だと戻り値がintで0が成功、それ以外が失敗ってのか良くあるけど、c++もこの形が一般的?(偽が成功、真が失敗)
個人的には前者を良く使うんだけど
c++的に関数のbool型戻り値に関数の成功失敗返すとして、真が成功で偽が失敗が一般的?
c言語だと戻り値がintで0が成功、それ以外が失敗ってのか良くあるけど、c++もこの形が一般的?(偽が成功、真が失敗)
個人的には前者を良く使うんだけど
2020/04/01(水) 13:55:09.05ID:BVkSt5Rw
boolとintで区別するってのが一般的で
boolの場合言ってる通りでintの場合cの流儀に沿うのが普通じゃね。
boolの場合言ってる通りでintの場合cの流儀に沿うのが普通じゃね。
93はちみつ餃子 ◆8X2XSCHEME
2020/04/01(水) 14:38:59.32ID:S74lm4t5 >>91
エラーであることと同時にエラーの内容 (エラーコード) も返したいという要求がある。
なので 0 を成功として、失敗ならエラー内容に対応する数値 (真値) を返すというやり方が生まれた。
でも C の標準ライブラリには失敗として 0 を返した上でエラーの内容は errno に設定するものもあるし、
グダグダなんやわ。
真偽のどちらを成功とするか失敗とするかは、どちらかが一般的と言えるほど統一されてはいないと思う。
C++ だと失敗は例外で投げてしまえるから返却値はあくまでも正常系のみの結果を返すべきという意見もあるし、
例外は何かと問題があるので避けた方がいいという人もいる。
std::optional は「有効な値があるとき」と「有効な値がないとき」を区別できるけど、
成功・失敗に対応づけるにはちょっとイマイチな感じもあるしなぁ……。
結局のところ場合による。
エラーであることと同時にエラーの内容 (エラーコード) も返したいという要求がある。
なので 0 を成功として、失敗ならエラー内容に対応する数値 (真値) を返すというやり方が生まれた。
でも C の標準ライブラリには失敗として 0 を返した上でエラーの内容は errno に設定するものもあるし、
グダグダなんやわ。
真偽のどちらを成功とするか失敗とするかは、どちらかが一般的と言えるほど統一されてはいないと思う。
C++ だと失敗は例外で投げてしまえるから返却値はあくまでも正常系のみの結果を返すべきという意見もあるし、
例外は何かと問題があるので避けた方がいいという人もいる。
std::optional は「有効な値があるとき」と「有効な値がないとき」を区別できるけど、
成功・失敗に対応づけるにはちょっとイマイチな感じもあるしなぁ……。
結局のところ場合による。
2020/04/01(水) 17:14:10.11ID:15FH3/nz
おれも >>92 の認識
結果boolとintでfalse/0の意味が入れ替わるわけだが
intはエラーコードを返す余地があるが
boolの場合失敗をfalseでだけで返しても実用上役に立たないと思う
falseが返ってきたら呼び出し側は何をすればいいかまで考えるべき
内部エラー的などうしようもないもののときは関数内で勝手にabortした方がまし
結果boolとintでfalse/0の意味が入れ替わるわけだが
intはエラーコードを返す余地があるが
boolの場合失敗をfalseでだけで返しても実用上役に立たないと思う
falseが返ってきたら呼び出し側は何をすればいいかまで考えるべき
内部エラー的などうしようもないもののときは関数内で勝手にabortした方がまし
95デフォルトの名無しさん
2020/04/01(水) 18:14:31.33ID:MoTGnEfh >>94
実は、エラー番号を返されても、出来ることは限られていて、
ハードウェアエラーの様なものなら、使用者にそのメッセージを
表示することは出来るが、単に関数の呼び出し方の間違いの場合も
多くてその場合は開発時にエラー番号を調べて対処するしかない。
エラー番号によってプログラムの動作を変えて対処できるケースは全体のごく一部。
実は、エラー番号を返されても、出来ることは限られていて、
ハードウェアエラーの様なものなら、使用者にそのメッセージを
表示することは出来るが、単に関数の呼び出し方の間違いの場合も
多くてその場合は開発時にエラー番号を調べて対処するしかない。
エラー番号によってプログラムの動作を変えて対処できるケースは全体のごく一部。
2020/04/01(水) 19:18:06.29ID:15FH3/nz
97デフォルトの名無しさん
2020/04/01(水) 19:24:00.89ID:Awd6zvg2 std::sortにconstexprが付くことについてコメントお願いします。
2020/04/01(水) 22:38:47.73ID:3pIDnj5r
標準ライブラリで付けられるところには全部付けろ
99デフォルトの名無しさん
2020/04/01(水) 23:20:02.25ID:Awd6zvg2 コンパイル時にソートしてくれるってやばない?
100デフォルトの名無しさん
2020/04/02(木) 00:18:03.16ID:Gf7PuiHp 左様boolを成功か失敗かの意味で使うのが悪い
boolは単純に真偽として解釈すべきでありかつその解釈で十分な場合に使う他無い
例: std::vector::empty()
どーしても成功か失敗かの意味で使いたいなら
成功なら真、失敗なら偽の値を返す関数なりマクロなりで
wrapした結果をboolにすべきや
例:
inline bool SUCCEEDED(int retval) { retun (retval == 0); }
inline bool FAILED(int retval) { return (retval != 0); }
boolは単純に真偽として解釈すべきでありかつその解釈で十分な場合に使う他無い
例: std::vector::empty()
どーしても成功か失敗かの意味で使いたいなら
成功なら真、失敗なら偽の値を返す関数なりマクロなりで
wrapした結果をboolにすべきや
例:
inline bool SUCCEEDED(int retval) { retun (retval == 0); }
inline bool FAILED(int retval) { return (retval != 0); }
101デフォルトの名無しさん
2020/04/02(木) 00:21:01.87ID:Wbq1ni9c constexprはやばいがなぜにソート?
というかコンパイル時ソートの需要なんかあんのか?
100万件のデータをソースに埋め込んでコンパイル時にソートしたいとは思わないな
というかコンパイル時ソートの需要なんかあんのか?
100万件のデータをソースに埋め込んでコンパイル時にソートしたいとは思わないな
102デフォルトの名無しさん
2020/04/02(木) 00:25:29.31ID:44dV9Os2 そんなでかいのコンパイルに時間がかかって仕方がない
数十数百までなら実用的なコンパイル時間で済みそうだし需要はあるだろ
数十数百までなら実用的なコンパイル時間で済みそうだし需要はあるだろ
103デフォルトの名無しさん
2020/04/02(木) 00:38:17.67ID:Wbq1ni9c その程度なら実行時でいいやってなる
104デフォルトの名無しさん
2020/04/02(木) 00:43:04.78ID:44dV9Os2 ソート後もまだコンパイル時評価に使えるじゃん
105デフォルトの名無しさん
2020/04/02(木) 01:00:56.93ID:Wbq1ni9c 意味わからんけど
コンパイル時にソートしてくれるのはいいと思うよ
でもそれがスゲー便利とはならないだろうなってこと
コンパイル時にソートしてくれるのはいいと思うよ
でもそれがスゲー便利とはならないだろうなってこと
106デフォルトの名無しさん
2020/04/02(木) 01:08:47.28ID:I8hlhwK7 明らかにアンチパターンだろ。
constexprてフーリエ変換の係数とか定数だけどちょっとした計算が必要なものに使うもんだろうに。
constexprてフーリエ変換の係数とか定数だけどちょっとした計算が必要なものに使うもんだろうに。
107デフォルトの名無しさん
2020/04/02(木) 01:25:43.89ID:44dV9Os2 いや、それこそruntimeで良いんじゃね
108はちみつ餃子 ◆8X2XSCHEME
2020/04/02(木) 03:49:46.91ID:sLIn31jD109デフォルトの名無しさん
2020/04/02(木) 06:22:02.07ID:I8hlhwK7 >>108
不自然なことやってバギーだったり、その挙動がユーザーにとってデバッグしずらいものだったら
プログラマーにとって損だろ。
なんでもコンパイラにやらせればいいと思ってる輩はそのことを全く理解してない。
不自然なことやってバギーだったり、その挙動がユーザーにとってデバッグしずらいものだったら
プログラマーにとって損だろ。
なんでもコンパイラにやらせればいいと思ってる輩はそのことを全く理解してない。
110デフォルトの名無しさん
2020/04/02(木) 06:40:45.16ID:H71dGAdS ソートが必要になる程のデータ数をコンパイル時に用意するならコンパイル時ファイル読み込みも必要じゃない
111デフォルトの名無しさん
2020/04/02(木) 08:31:42.99ID:SbwrDqdV >>109
> 不自然なことやって
不自然かどうかは単なるお前の主観
> バギーだったり、
処理系の問題
> その挙動がユーザーにとってデバッグしずらいものだったら
無理矢理の仮定
> プログラマーにとって損だろ。
お前にとって損なだけ
コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
嫌なら使わなきゃいいだけ
> 不自然なことやって
不自然かどうかは単なるお前の主観
> バギーだったり、
処理系の問題
> その挙動がユーザーにとってデバッグしずらいものだったら
無理矢理の仮定
> プログラマーにとって損だろ。
お前にとって損なだけ
コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
嫌なら使わなきゃいいだけ
112デフォルトの名無しさん
2020/04/02(木) 12:24:51.88ID:Wbq1ni9c あんまり同意できないね
仕事で使う上だと嫌なら使うなというのは困る
多人数で作るうえでは使わないなら使われない仕組みが必要だからね
あとユーザが気軽にO(n^2)、O(n^3)みたない激重アルゴリズムをコンパイルフェーズに
組み込めるわけだけど、それコンパイラの仕事か?と思う
大規規模開発だとコンパイル時間の伸びは問題になる
フェーズわけるべきだよね
実際ビルド時に事前計算するものは多々あるけど、個別にスクリプトとか組むことに別に不満ないし
c++のコンパイルで一発で完結する必要性を感じない
仕事で使う上だと嫌なら使うなというのは困る
多人数で作るうえでは使わないなら使われない仕組みが必要だからね
あとユーザが気軽にO(n^2)、O(n^3)みたない激重アルゴリズムをコンパイルフェーズに
組み込めるわけだけど、それコンパイラの仕事か?と思う
大規規模開発だとコンパイル時間の伸びは問題になる
フェーズわけるべきだよね
実際ビルド時に事前計算するものは多々あるけど、個別にスクリプトとか組むことに別に不満ないし
c++のコンパイルで一発で完結する必要性を感じない
113デフォルトの名無しさん
2020/04/02(木) 13:47:09.18ID:RbNpa6BP 嫌なら使うなって、C/C++のことだろ
つまり転職したほうがいいと暗に言っている
つまり転職したほうがいいと暗に言っている
114デフォルトの名無しさん
2020/04/02(木) 13:48:21.30ID:1Y8qGLwI うん、まぁ、自分ならメタプログラミングとか特殊化で
定数のソートがあったら助かるかも・・助からないかも・・程度だけど
標準のやることに疑問を呈すと必ず>>111みたいな変なのが湧くよね
まぁ、コンパイル時のソートしてもしなくてもコンパイル時のオーバーヘッドは微々たるもんじゃね?
大量のインスタンス化とかが起きなければ。
定数のソートがあったら助かるかも・・助からないかも・・程度だけど
標準のやることに疑問を呈すと必ず>>111みたいな変なのが湧くよね
まぁ、コンパイル時のソートしてもしなくてもコンパイル時のオーバーヘッドは微々たるもんじゃね?
大量のインスタンス化とかが起きなければ。
115デフォルトの名無しさん
2020/04/02(木) 13:54:25.98ID:1Y8qGLwI あ、あと
>コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
20年使ってるがそんな思想聞いたこともない
あとコンパイル時に出来る(上に、後で困ったりしない)場面って少ないよ
実際のソフト開発に使ったことないと気付かないんだろうけど
>コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
20年使ってるがそんな思想聞いたこともない
あとコンパイル時に出来る(上に、後で困ったりしない)場面って少ないよ
実際のソフト開発に使ったことないと気付かないんだろうけど
116デフォルトの名無しさん
2020/04/02(木) 14:01:37.69ID:Tie7sLxb いや、constexprのお陰もあってコンパイル時に解決できることは思いの外増えている
117デフォルトの名無しさん
2020/04/02(木) 14:09:38.15ID:1Y8qGLwI 実例挙げてくれ
118はちみつ餃子 ◆8X2XSCHEME
2020/04/02(木) 14:31:13.11ID:sLIn31jD constexpr つっても定数式の文脈以外ではコンパイルのフェイズで計算する保証はないよ。
コンパイラの裁量でほどほどにしてくれるからコンパイルのコストが極端に増大することは心配しなくていい。
(たぶんオプションとかで制御できるようになってる。)
constexpr の制約の範囲内に変形するのが難しいようなものまで無理して constexpr 化する必要はないけど、
付けれるもんなら付けとくくらいのスタンスでよいんじゃないかなぁ。
コンパイラの裁量でほどほどにしてくれるからコンパイルのコストが極端に増大することは心配しなくていい。
(たぶんオプションとかで制御できるようになってる。)
constexpr の制約の範囲内に変形するのが難しいようなものまで無理して constexpr 化する必要はないけど、
付けれるもんなら付けとくくらいのスタンスでよいんじゃないかなぁ。
119デフォルトの名無しさん
2020/04/02(木) 14:37:59.99ID:Qj/v/C6S 保証も何も、実行時にしか分からん値をどうやってコンパイル時に計算するんだ
はちみつ自身よく分かってないだろ
はちみつ自身よく分かってないだろ
120デフォルトの名無しさん
2020/04/02(木) 14:38:59.27ID:Qj/v/C6S >(たぶんオプションとかで制御できるようになってる。)
初耳だな
初耳だな
121はちみつ餃子 ◆8X2XSCHEME
2020/04/02(木) 14:44:22.92ID:sLIn31jD gcc のオプションをざっと検索してみたけど、
定数式の文脈とそうでないときを区別して指定するようなものは見つからんかった……。
定数式の文脈とそうでないときを区別して指定するようなものは見つからんかった……。
122はちみつ餃子 ◆8X2XSCHEME
2020/04/02(木) 14:45:31.73ID:sLIn31jD >>119
入力がコンパイル時にわかる値 (定数式) でもその関数の呼び出し自身が定数式の文脈にない場合のことを言ってる。
入力がコンパイル時にわかる値 (定数式) でもその関数の呼び出し自身が定数式の文脈にない場合のことを言ってる。
123デフォルトの名無しさん
2020/04/02(木) 15:00:36.45ID:Qj/v/C6S >>122
「定数式の文脈以外では」保証もクソも原理的に不可能だと言ってんの
「定数式の文脈以外では」保証もクソも原理的に不可能だと言ってんの
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」★2 [ぐれ★]
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」 [ぐれ★]
- 【埼玉】「無免許で高速道路で事故」トラックの追突事故で10代男性死亡 無免許過失運転致死の疑いでトルコ国籍の男(22)逮捕 戸田市 [ぐれ★]
- 広島・廿日市、おこめ券配布せず 全市民に3000円現金給付へ [どどん★]
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★6 [七波羅探題★]
- 【三重】少年3人不起訴 川で友人を溺死させた疑い 津地検 [シャチ★]
- 日本人の主食、小麦(パスタ、パン、うどん)になる 米食ってる奴は非国民 わしゃうろんがええよ [402859164]
- 【実況】博衣こよりのえちえちチーズケーキを仕込み(雑談あり)🧪
- 朝日新聞記者「中国軍のレーダー照射はこめかみに銃を突きつけられたのと同じ。僕なら反撃して撃墜してる」高市 [931948549]
- 野党が“おこめ券”追及 高市早苗「鈴木農水大臣がお米券大好きなんよ」😹 [817148728]
- 【速報】1ポンド210円で日英GDP逆転(残り1.5円)...世界6位の経済規模に転落 [237216734]
- 【高市悲報】あまかいちし、「お米券は事務手数料がかかり過ぎるので、現金給付にしまーす!」 [947959745]
