C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part145
http://mevius.5ch.net/test/read.cgi/tech/1568362404/
このスレもよろしくね。
【初心者歓迎】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++相談室 part146
■ このスレッドは過去ログ倉庫に格納されています
2019/11/07(木) 11:35:36.76ID:4wggfTwe
606はちみつ餃子 ◆8X2XSCHEME
2019/12/05(木) 00:23:37.10ID:XYdg44Nt 必要なら読むし必要じゃないならないなら読まないってだけのことだろ。
そんなん場合によるっつーつまらん結論しかないと思うが。
そんなん場合によるっつーつまらん結論しかないと思うが。
607デフォルトの名無しさん
2019/12/05(木) 00:28:04.37ID:wvPvimki はいいつものクソ正論いただきました
608デフォルトの名無しさん
2019/12/05(木) 00:35:44.19ID:dM4mxJ4y 実の無い(楽しそうでもない)話をつづけられるよりはクソ正論で鎮火してくれたほうがマシに思う。
件の人たちはそれで鎮火するような人でもないんだろうけど。
件の人たちはそれで鎮火するような人でもないんだろうけど。
609デフォルトの名無しさん
2019/12/05(木) 00:43:36.10ID:2jEFb1Vk 互いに見下しあい罵倒しあってこそC++er
ここは不毛なマウント取り合戦の場C++スレ
鎮火する必要なし
ここは不毛なマウント取り合戦の場C++スレ
鎮火する必要なし
610デフォルトの名無しさん
2019/12/05(木) 01:15:42.96ID:+j7BXLrg また髪の話をしてる
611デフォルトの名無しさん
2019/12/05(木) 02:59:31.66ID:9zn59iXI すまんが、レベルの低い人から見ると、レベルの高い人が気軽に話した
内容が「マウントをとられた」と思ってしまうんだと思う。
そういうつもりで言ってなくても。
これは、公立の小学校でよく起きる現象で、問題になっている。
内容が「マウントをとられた」と思ってしまうんだと思う。
そういうつもりで言ってなくても。
これは、公立の小学校でよく起きる現象で、問題になっている。
612デフォルトの名無しさん
2019/12/05(木) 03:04:36.20ID:9zn59iXI >>611
蛇足だが、これは欧米諸国でよく知られた現象。
アメリカで記名製掲示板が流行るのは、匿名性掲示板ではどうしても
それが起きてしまうので、それをよく分かった上でやっているのかも
知れない。それだけの理由ではないだろうけど。
蛇足だが、これは欧米諸国でよく知られた現象。
アメリカで記名製掲示板が流行るのは、匿名性掲示板ではどうしても
それが起きてしまうので、それをよく分かった上でやっているのかも
知れない。それだけの理由ではないだろうけど。
613デフォルトの名無しさん
2019/12/05(木) 06:18:49.18ID:eAZGTWY0614デフォルトの名無しさん
2019/12/05(木) 08:26:15.95ID:V4GZwDuE しかしあれだな、C++ほどハゲがよく似合う言語を知らない
615デフォルトの名無しさん
2019/12/05(木) 11:35:47.86ID:tjjaS4Ug 江添亮のC++入門 (webドラフト版? https://ezoeryou.github.io/cpp-intro/#再帰関数 )
を読んでます。
>例えば以下は階乗を計算する再帰で書かれたループだ。
> int factorial( int n ) { ...
> return n * factorial(n-1) ;
> ...
>このコードは末尾再帰になっている。
>末尾再帰は非再帰のループに機械的に変換できる特徴を持っている
これ factorial(n-1) が返ってきたらスタックに積んである n を掛けないといけませんよね。
厳密には末尾再帰とは言えない気がします。
そういうの無しに「直帰でコール元に値を渡せる場合」に末尾再帰と言えるのだと思ってたんですが、
私の理解が間違っているのでしょうか?
まあ今のコンパイラーは賢いので細かい事気にする必要ないのかもしれませんが。
を読んでます。
>例えば以下は階乗を計算する再帰で書かれたループだ。
> int factorial( int n ) { ...
> return n * factorial(n-1) ;
> ...
>このコードは末尾再帰になっている。
>末尾再帰は非再帰のループに機械的に変換できる特徴を持っている
これ factorial(n-1) が返ってきたらスタックに積んである n を掛けないといけませんよね。
厳密には末尾再帰とは言えない気がします。
そういうの無しに「直帰でコール元に値を渡せる場合」に末尾再帰と言えるのだと思ってたんですが、
私の理解が間違っているのでしょうか?
まあ今のコンパイラーは賢いので細かい事気にする必要ないのかもしれませんが。
616デフォルトの名無しさん
2019/12/05(木) 11:37:52.20ID:IbmhSLeW617デフォルトの名無しさん
2019/12/05(木) 12:32:19.12ID:RTwQsK8m >>615
末尾再帰じゃないよ
末尾再帰じゃないよ
618デフォルトの名無しさん
2019/12/05(木) 13:51:16.60ID:tjjaS4Ug >>617 ですよね。
ちょっと気になってたのでスッキリしました。
ちょっと気になってたのでスッキリしました。
619デフォルトの名無しさん
2019/12/05(木) 18:12:34.01ID:5PaJAEA2 簡単にループに出来るものはループで記述した方が良いよ
末尾再帰の場合もそうじゃない場合も
実行速度、使用リソース、
デバッグしやすさ、
スタック計算ツールなどツール類の使用、
などなどいろんな要素で
末尾再帰の場合もそうじゃない場合も
実行速度、使用リソース、
デバッグしやすさ、
スタック計算ツールなどツール類の使用、
などなどいろんな要素で
620デフォルトの名無しさん
2019/12/05(木) 18:50:53.78ID:9zn59iXI >>619
本当は、再帰呼び出しだとスタックサイズの制限により呼び出しの深さ(階数)
に制限が付いてしまう。ローカル変数を沢山使っている関数で、
1000万個のオブジェクトを再帰的に処理すると、スタックオーバーフロー
が出てもおかしくない。しかも、最近のマルチスレッド環境だと、
スタックのサイズはどうしても制限が強くなり勝ち。
本当は、再帰呼び出しだとスタックサイズの制限により呼び出しの深さ(階数)
に制限が付いてしまう。ローカル変数を沢山使っている関数で、
1000万個のオブジェクトを再帰的に処理すると、スタックオーバーフロー
が出てもおかしくない。しかも、最近のマルチスレッド環境だと、
スタックのサイズはどうしても制限が強くなり勝ち。
621デフォルトの名無しさん
2019/12/05(木) 18:58:39.27ID:5PaJAEA2 一言で言うと「使用リソース」だね
622デフォルトの名無しさん
2019/12/05(木) 19:02:32.74ID:5PaJAEA2 「最近のマルチスレッド環境」はあまり関係ない
固定スタックサイズの組み込みCPUの方がヤバい
PICみたいなハードウェアスタックだともっとヤバい
固定スタックサイズの組み込みCPUの方がヤバい
PICみたいなハードウェアスタックだともっとヤバい
623デフォルトの名無しさん
2019/12/05(木) 19:28:34.51ID:ZSRmDUxb 検討事項が増えるから仕事で再帰は使わんね。
理解できない人も多いし。
理解できない人も多いし。
624デフォルトの名無しさん
2019/12/05(木) 19:42:30.55ID:9zn59iXI >>622
シングルスレッドだと、スタックは自動伸張することが可能だった。
ところが、32BIT のマルチスレッド環境だと仮想メモリ空間のアドレス
空間自体が不足してしまうので、それは難しい。
ただし、64BIT 環境だと仮想メモリ空間が大きいので余り問題にならない
かも知れない。
シングルスレッドだと、スタックは自動伸張することが可能だった。
ところが、32BIT のマルチスレッド環境だと仮想メモリ空間のアドレス
空間自体が不足してしまうので、それは難しい。
ただし、64BIT 環境だと仮想メモリ空間が大きいので余り問題にならない
かも知れない。
625デフォルトの名無しさん
2019/12/05(木) 19:54:34.15ID:5zWy9aB9 再帰の例でよくでてくるフィボナッチ数列の計算なら
再帰より for で二変数保持しながら計算した方が性能でも可読性でも上だろうな。
再帰より for で二変数保持しながら計算した方が性能でも可読性でも上だろうな。
626デフォルトの名無しさん
2019/12/05(木) 20:04:07.94ID:5PaJAEA2627デフォルトの名無しさん
2019/12/05(木) 20:10:23.46ID:5PaJAEA2628デフォルトの名無しさん
2019/12/05(木) 20:16:10.38ID:5PaJAEA2 再帰をループに置き換えるので面倒なのは
いろんな箇所でたくさん分岐するヤツ
まあでも面倒ってだけで、
必ず再帰を使わずに記述出来る
いろんな箇所でたくさん分岐するヤツ
まあでも面倒ってだけで、
必ず再帰を使わずに記述出来る
629デフォルトの名無しさん
2019/12/05(木) 20:21:10.87ID:5zWy9aB9 treeを辿るコードなんかは再帰のが書きやすいわな。
630デフォルトの名無しさん
2019/12/05(木) 20:23:50.71ID:5PaJAEA2 treeをたどるコードは再帰コールするのが1箇所だからまだ楽な方
631デフォルトの名無しさん
2019/12/05(木) 20:24:01.37ID:9zn59iXI >>629
Tree は再帰でやるべきものの一つ。
スタックの制限も、Treeの「段数(階数)」自体が余り深くなりにくいので
問題が生じにくく、再帰でやっても問題ないものの一つでもある。
ただし、親子関係の深さ方向だけを再帰にし、兄弟方向は、単純な
ループを使うべき。
Tree は再帰でやるべきものの一つ。
スタックの制限も、Treeの「段数(階数)」自体が余り深くなりにくいので
問題が生じにくく、再帰でやっても問題ないものの一つでもある。
ただし、親子関係の深さ方向だけを再帰にし、兄弟方向は、単純な
ループを使うべき。
632デフォルトの名無しさん
2019/12/05(木) 20:28:30.76ID:5PaJAEA2 再帰にすべきかどうかはものによる
例えばstd::setの検索は普通ループを使う
例えばstd::setの検索は普通ループを使う
633デフォルトの名無しさん
2019/12/05(木) 20:38:37.36ID:tjjaS4Ug フィボナッチとかで再帰
末尾再帰を捨てる(性能とスタック無駄遣いに目を瞑る)と可読性はかなりいいと思うんです。
int fibo(int n) {
if (n<=2) return 1;
else return fibo(n-1) + fino(n-2);
}
その場で使い捨てるようなプログラムにはアリだと思います。
でも末尾再帰を目指すと.. . .
int fibo(int n, int a=1, int b=1){
if (n<=2) return b;
else return fibo(n-1, b, a+b);
}
どうなんですかね. . .。Lisp脳だと forループより好まれるかもしれません。
ちゃんと末尾再帰最適化が効けば性能は良いのでしょう。
末尾再帰を捨てる(性能とスタック無駄遣いに目を瞑る)と可読性はかなりいいと思うんです。
int fibo(int n) {
if (n<=2) return 1;
else return fibo(n-1) + fino(n-2);
}
その場で使い捨てるようなプログラムにはアリだと思います。
でも末尾再帰を目指すと.. . .
int fibo(int n, int a=1, int b=1){
if (n<=2) return b;
else return fibo(n-1, b, a+b);
}
どうなんですかね. . .。Lisp脳だと forループより好まれるかもしれません。
ちゃんと末尾再帰最適化が効けば性能は良いのでしょう。
634デフォルトの名無しさん
2019/12/05(木) 20:48:58.05ID:5PaJAEA2635デフォルトの名無しさん
2019/12/05(木) 21:03:01.64ID:tjjaS4Ug あちら(Lisp)の世界ではそうでもないみたいですよ。
636デフォルトの名無しさん
2019/12/05(木) 21:09:55.69ID:5PaJAEA2 へ〜
637デフォルトの名無しさん
2019/12/05(木) 21:23:00.63ID:oayOS3nx C++てparallel_forとか未だにないんだな、まぁTBB使えばあるけど標準規格には用意されてない
仕方がないんでPartitionerは自前で作ったが、そんな付け焼き刃用意したところで、
いちいち明示的に各スレッドの終了の待ちあわせせにゃならん。
挙げ句の果てに
mtx.lock()
----
mtx.unlock()
て orz
クリティカルセクションはブロックで囲って
lock(mtx){
}
とでも書かせろや
オートunlockとかしょーもないもんは用意してバカじゃねーのか
しかも、未だにasync/await はなくて、C++20で実装て。
何が必要かわかってないのかC++規格作ってるアホ共
死ね
仕方がないんでPartitionerは自前で作ったが、そんな付け焼き刃用意したところで、
いちいち明示的に各スレッドの終了の待ちあわせせにゃならん。
挙げ句の果てに
mtx.lock()
----
mtx.unlock()
て orz
クリティカルセクションはブロックで囲って
lock(mtx){
}
とでも書かせろや
オートunlockとかしょーもないもんは用意してバカじゃねーのか
しかも、未だにasync/await はなくて、C++20で実装て。
何が必要かわかってないのかC++規格作ってるアホ共
死ね
638デフォルトの名無しさん
2019/12/05(木) 21:36:40.64ID:JlYSK1cQ つstd::lock_guard
639デフォルトの名無しさん
2019/12/05(木) 21:51:24.38ID:u0CioZb2 adync awaitなんてネイティブで実装しようとしたら面倒なのわかるだろうに
それでもぶっこんでくるのだからc++11以降は完全にポリシー変更しているよね
それでもぶっこんでくるのだからc++11以降は完全にポリシー変更しているよね
640デフォルトの名無しさん
2019/12/05(木) 21:57:53.51ID:dM4mxJ4y >>637 std::for_each(std::execution::par, ...) じゃダメだったの?
641デフォルトの名無しさん
2019/12/05(木) 22:07:45.52ID:q0kDwfyl ツリーの巡回はイテレータにするとスタックとキューを入れ替えるだけで深さ優先と幅優先を切り替えられますよ。
STLのスタックとキューはインターフェースが違うのでひと工夫必要ですが。
algorithmも使えてウマウマです。
STLのスタックとキューはインターフェースが違うのでひと工夫必要ですが。
algorithmも使えてウマウマです。
643デフォルトの名無しさん
2019/12/05(木) 22:53:24.80ID:wvPvimki おいおい
そこはcpsで書いてマウント取るところだろ
そこはcpsで書いてマウント取るところだろ
644デフォルトの名無しさん
2019/12/05(木) 23:00:13.77ID:uXzevjeq645デフォルトの名無しさん
2019/12/05(木) 23:44:19.10ID:JallKI28 状況説明:
Visual Studio 2019 Version 16.4.0 で std::exception::what() の戻り値を無視すると以下のようなC4834の警告が出るようになった。
> warning C4834: 'nodiscard' 属性を持つ関数の戻り値を破棄しています
なお、catchスコープでeについて何か書かないと以下の警告が出てしまう。
> warning C4101: 'e': ローカル変数は 1 度も使われていません。
今は以下のように記述して警告C4101が出ないようにしている。
try
{
// do something.
}
catch(std::exception& e)
{
e.what();
}
質問:
C4101とC4834の両方とも出ないようにするにはどうしたらいい?
Visual Studio 2019 Version 16.4.0 で std::exception::what() の戻り値を無視すると以下のようなC4834の警告が出るようになった。
> warning C4834: 'nodiscard' 属性を持つ関数の戻り値を破棄しています
なお、catchスコープでeについて何か書かないと以下の警告が出てしまう。
> warning C4101: 'e': ローカル変数は 1 度も使われていません。
今は以下のように記述して警告C4101が出ないようにしている。
try
{
// do something.
}
catch(std::exception& e)
{
e.what();
}
質問:
C4101とC4834の両方とも出ないようにするにはどうしたらいい?
646デフォルトの名無しさん
2019/12/05(木) 23:57:51.72ID:2jEFb1Vk >>645
(void)e.what();
(void)e.what();
647645
2019/12/05(木) 23:58:13.71ID:JallKI28 自己解決しました。
try
{
// do something.
}
catch(std::exception& e)
{
(void)e;
}
try
{
// do something.
}
catch(std::exception& e)
{
(void)e;
}
649デフォルトの名無しさん
2019/12/05(木) 23:59:36.77ID:uXzevjeq catch(std::exception&)
でええやん
でええやん
650デフォルトの名無しさん
2019/12/06(金) 00:01:11.04ID:Cd9yyMrn >>645 ほんとうに例外を何も処理せず握りつぶしたいの?どんな状況?
653デフォルトの名無しさん
2019/12/06(金) 00:24:27.98ID:hYHuFzfT VCは2019から返り値を捨てるコードに警告出すようになって鬱陶しい
654デフォルトの名無しさん
2019/12/06(金) 00:27:04.95ID:R5wwI9SD [[nodiscard]]を確認せずに捨てる奴が悪い
655デフォルトの名無しさん
2019/12/06(金) 00:30:55.24ID:Cd9yyMrn656デフォルトの名無しさん
2019/12/06(金) 00:51:39.38ID:jImJStBO 終了させるにしてもちゃんとやれ
657645
2019/12/06(金) 00:54:05.25ID:Rpl4CMwP >>655
どうせなにもできない事には変わりないので無視でいいかなと。
スレッド終了時にプログラム固有のリソース解放処理を確実にやりたい目的でのthrow&catchなのでC++標準ライブラリ自身の出す例外は無視、的な。
どうせなにもできない事には変わりないので無視でいいかなと。
スレッド終了時にプログラム固有のリソース解放処理を確実にやりたい目的でのthrow&catchなのでC++標準ライブラリ自身の出す例外は無視、的な。
658デフォルトの名無しさん
2019/12/06(金) 01:06:58.12ID:jImJStBO ログ出力という大事な仕事があるだろ
659デフォルトの名無しさん
2019/12/06(金) 02:04:04.00ID:Cd9yyMrn >>657
それだとほんとに何か問題があって例外が飛んでるときに気づけなくて危なさ沿う、という話。
struct thread_exit {} とか専用の例外をthrow&catchしとけば、目的を達成しながら問題検出もできそうな。
それだとほんとに何か問題があって例外が飛んでるときに気づけなくて危なさ沿う、という話。
struct thread_exit {} とか専用の例外をthrow&catchしとけば、目的を達成しながら問題検出もできそうな。
660デフォルトの名無しさん
2019/12/06(金) 06:39:31.51ID:pHI2Uem1 >>654
正論
正論
661デフォルトの名無しさん
2019/12/06(金) 07:31:29.17ID:zfbHpqVT662デフォルトの名無しさん
2019/12/06(金) 09:21:05.01ID:WVLKHQiQ663デフォルトの名無しさん
2019/12/06(金) 12:56:29.50ID:vJ3416lC665デフォルトの名無しさん
2019/12/06(金) 14:28:22.22ID:hyokDgJv もしかしてメンバ関数の定義で引数や戻り値に不完全型を使っても許されるようになりましたか?
autoが許されるのだから、許されて良いような気がするのですが。
autoが許されるのだから、許されて良いような気がするのですが。
666デフォルトの名無しさん
2019/12/06(金) 14:55:34.36ID:qwyC8IXX 厳密にはわからんけど、クラステンプレートやメンバ関数テンプレートだと
それらが実体化されるより前であれば不完全型は使えるはず(コンパイラによっても変わることあるけど
autoも似たような理屈だと思う、宣言だけして関数定義より前で使うとエラーになるはず
それらが実体化されるより前であれば不完全型は使えるはず(コンパイラによっても変わることあるけど
autoも似たような理屈だと思う、宣言だけして関数定義より前で使うとエラーになるはず
667デフォルトの名無しさん
2019/12/06(金) 15:04:26.66ID:hyokDgJv https://ja.cppreference.com/w/cpp/language/function
> 関数の引数の型および戻り値の型は、削除された関数を除き (C++11以上)不完全クラス型にできません。 完全性のチェックは関数の本体の文脈で行われます。
これはそういうことを言ってるんですかね。
> 関数の引数の型および戻り値の型は、削除された関数を除き (C++11以上)不完全クラス型にできません。 完全性のチェックは関数の本体の文脈で行われます。
これはそういうことを言ってるんですかね。
668デフォルトの名無しさん
2019/12/06(金) 15:08:45.40ID:hyokDgJv 関数本体内のコンテキストで完全型になっていれば良いのであれば、いろいろできるような気がする。
あんなことやこんなことが。
あんなことやこんなことが。
669デフォルトの名無しさん
2019/12/06(金) 15:14:03.21ID:qwyC8IXX あーそういうことだね
関数定義前なら不完全でもいいってことだと思う
すまんテンプレートには限らないぽいな
関数定義前なら不完全でもいいってことだと思う
すまんテンプレートには限らないぽいな
670デフォルトの名無しさん
2019/12/06(金) 15:29:10.59ID:hyokDgJv どうもありがとう。
671デフォルトの名無しさん
2019/12/06(金) 15:45:43.96ID:LIPaYWZD >>661
step =1000000;
for( double r2 = R2 - dev2; r2 < R2 + dev2; r2 += dev2 / step ){
}
こいつを並列化したいんだが、ループカウンタをintに変更するとしても、
2M ノードのvector確保するわけ?
ループカウンタ設定するために並列化要るがなw
単にループ回したいだけなのに巨大なメモリ要るてww
調べてみてもC#やtbbのparallel_for相当がないんだが
これら見ながら企画作ったC++規格策定メンバーってお前と同じパープリンじゃないのか?
step =1000000;
for( double r2 = R2 - dev2; r2 < R2 + dev2; r2 += dev2 / step ){
}
こいつを並列化したいんだが、ループカウンタをintに変更するとしても、
2M ノードのvector確保するわけ?
ループカウンタ設定するために並列化要るがなw
単にループ回したいだけなのに巨大なメモリ要るてww
調べてみてもC#やtbbのparallel_for相当がないんだが
これら見ながら企画作ったC++規格策定メンバーってお前と同じパープリンじゃないのか?
672デフォルトの名無しさん
2019/12/06(金) 16:13:34.34ID:zfbHpqVT673デフォルトの名無しさん
2019/12/06(金) 16:14:35.15ID:hYHuFzfT 初手人格否定はC++erのセオリー
674デフォルトの名無しさん
2019/12/06(金) 16:14:40.19ID:jImJStBO >>671
お前が生きてる価値の無いゴミなだけ
お前が生きてる価値の無いゴミなだけ
675デフォルトの名無しさん
2019/12/06(金) 16:39:35.59ID:qwyC8IXX >>661もたいがい無意味に煽ってる書き込みだと思うがw
676デフォルトの名無しさん
2019/12/06(金) 17:15:36.33ID:hyokDgJv677デフォルトの名無しさん
2019/12/06(金) 18:34:35.34ID:PPEOwhLk >>671
OpenMP & SIMD intrinsics
OpenMP & SIMD intrinsics
678デフォルトの名無しさん
2019/12/06(金) 19:25:13.77ID:3oohkeAj lock_guard使わずになに使うの?
679デフォルトの名無しさん
2019/12/06(金) 19:35:24.69ID:3J8eqh7h ひのきのぼう と かわのふく
680デフォルトの名無しさん
2019/12/06(金) 22:24:12.87ID:hyokDgJv ヒノキの棒でぶっ叩けば人は死ぬし、皮の服は火焔や刃物を弾く。
どちらかというと上級者向けの装備だと思います。
どちらかというと上級者向けの装備だと思います。
681デフォルトの名無しさん
2019/12/06(金) 23:38:17.10ID:pm/DYA/c operator[]で読み書きって毎回調べないとできず
set()、val()とか関数で読み書きしてすますことが多いのだが
新文法などで簡単にやる方法わかりますか
set()、val()とか関数で読み書きしてすますことが多いのだが
新文法などで簡単にやる方法わかりますか
682デフォルトの名無しさん
2019/12/07(土) 01:06:30.72ID:5MyaotCE なにいうとるのかわからん
operator[]をどう実装してどこで使えばいいのか理解できてないという話なのか
operator[]をどう実装してどこで使えばいいのか理解できてないという話なのか
683デフォルトの名無しさん
2019/12/07(土) 01:08:17.23684デフォルトの名無しさん
2019/12/07(土) 01:59:52.93ID:4p8EX4B8685デフォルトの名無しさん
2019/12/07(土) 05:36:21.30ID:UnIspDfI686デフォルトの名無しさん
2019/12/07(土) 06:10:47.12 ちょくちょく初心者質問スレに行った方が良い人までここに堂々と書き込むのが
スレを妙な雰囲気にしてる
スレを妙な雰囲気にしてる
687デフォルトの名無しさん
2019/12/07(土) 06:56:32.11ID:C/SdN+6e688デフォルトの名無しさん
2019/12/07(土) 09:42:39.92ID:fV2E4bDP でもこのシグネチャのfactorialのままだと末尾再帰できなくね?>>642みたいになるかと。
689デフォルトの名無しさん
2019/12/07(土) 11:49:45.97ID:4p8EX4B8690デフォルトの名無しさん
2019/12/07(土) 11:56:48.08ID:vGCb4aWc 最初からそうかけよ
691デフォルトの名無しさん
2019/12/07(土) 11:57:37.74ID:4p8EX4B8 これのこと、毎回調べ直さないと作れない
プロキシ
実は、C++ でも、かなり無理やりですが、(見た目だけは)プロパティのようなことができたりします。 とりあえず、百聞は一見にしかずということで、以下の例を見てください。
利用側、すなわち、main の中では、 まるで普通の変数に対する代入・参照であるかのようなコードになっています。
このからくりは、 age の読み書きに、AgeProxy という名前の別のクラスを介することで実現します。 Age は AgeProxy 型の変数です。
AgeProxy の代入演算子(operator =)と int 型へのキャスト(operator int)を通して、 Person クラスの age 変数の読み書きをします。
ちなみに、こういう例のように、いったん別のクラスを通して値を読み書きしたりする方法を、 プロキシ(proxy: 代理)と呼びます。
まあ、このパターンは、利用側の見た目は綺麗になりますが、 実装は面倒ですし、実行効率もあまりよいとはいえません。
さらに言うと、プロパティを virtual 化しようとすると、 この例よりもさらに複雑な実装が必要になります。
こういう感じの話を振り返った上で、 改めて C# の「プロパティ」機能を見ると、 便利な機能だなぁとつくづく思います。
https://ufcpp.net/study/miscprog/accessor.html
プロキシ
実は、C++ でも、かなり無理やりですが、(見た目だけは)プロパティのようなことができたりします。 とりあえず、百聞は一見にしかずということで、以下の例を見てください。
利用側、すなわち、main の中では、 まるで普通の変数に対する代入・参照であるかのようなコードになっています。
このからくりは、 age の読み書きに、AgeProxy という名前の別のクラスを介することで実現します。 Age は AgeProxy 型の変数です。
AgeProxy の代入演算子(operator =)と int 型へのキャスト(operator int)を通して、 Person クラスの age 変数の読み書きをします。
ちなみに、こういう例のように、いったん別のクラスを通して値を読み書きしたりする方法を、 プロキシ(proxy: 代理)と呼びます。
まあ、このパターンは、利用側の見た目は綺麗になりますが、 実装は面倒ですし、実行効率もあまりよいとはいえません。
さらに言うと、プロパティを virtual 化しようとすると、 この例よりもさらに複雑な実装が必要になります。
こういう感じの話を振り返った上で、 改めて C# の「プロパティ」機能を見ると、 便利な機能だなぁとつくづく思います。
https://ufcpp.net/study/miscprog/accessor.html
692デフォルトの名無しさん
2019/12/07(土) 12:00:39.08ID:vGCb4aWc 相談じゃないなら他へ
693デフォルトの名無しさん
2019/12/07(土) 12:02:24.40ID:U9XnFfRh プロパティはコード上でフィールドのように扱えることよりもメンバとしてIDEが認識できるところに意味がある
最近はC#でもデザイナに頼らずに何でもコード上で済ませるスタイルが主流になりつつあり、プロパティの必要性は薄れている
初期化時にパラメータを纏めて渡したりするだけなら生フィールドで十分なわけだしな
最近はC#でもデザイナに頼らずに何でもコード上で済ませるスタイルが主流になりつつあり、プロパティの必要性は薄れている
初期化時にパラメータを纏めて渡したりするだけなら生フィールドで十分なわけだしな
694デフォルトの名無しさん
2019/12/07(土) 12:11:07.35ID:JfALL9r7 proxyで別に実行効率は下がらんよね
てかstd::vector<bool>は大昔から存在するし
てかstd::vector<bool>は大昔から存在するし
695デフォルトの名無しさん
2019/12/07(土) 12:25:43.42ID:cPeMBqq7 C++Builder使えばよいのでは。
696デフォルトの名無しさん
2019/12/07(土) 12:42:26.89ID:JVuyt12v >>684, >>684
他言語での getter/setter メソッド的な事をやりたいのだろうなあと考えてみました。
例えば a[i] と書かれたら、 内部データ(typename T) への参照(T&) を返すのではなく
新たに内部クラス(fields: owner, index)を用意して、そのオブジェクトを作って返すようにします。
これに代入演算子(operator =) と キャスト演算子(operator T()) を実装すれば...
・a[7] = 99; //setter
・cout << a[7]; //getter
こうやって普通にアクセスできます。メソッドを分離したお陰で、
添え字アクセスによるデータベースのupdate / select みたいな事が可能になります。
代入演算子は最低二種類必要で
Inner& operator =(const T& value); // a[i] = value
Inner& operator =(const Inner& rhs); // a[i] = a[j]
二つ目を実装しないと暗黙のコピー代入演算子が作られてしまい
a[i] = a[j]; のような代入操作は実質空文化します。(owner/indexがコピーされるだけ )
素人の思いつきですがサクっと試したら機能しました。
もっとスマートなやりかたもあるでしょう。
他言語での getter/setter メソッド的な事をやりたいのだろうなあと考えてみました。
例えば a[i] と書かれたら、 内部データ(typename T) への参照(T&) を返すのではなく
新たに内部クラス(fields: owner, index)を用意して、そのオブジェクトを作って返すようにします。
これに代入演算子(operator =) と キャスト演算子(operator T()) を実装すれば...
・a[7] = 99; //setter
・cout << a[7]; //getter
こうやって普通にアクセスできます。メソッドを分離したお陰で、
添え字アクセスによるデータベースのupdate / select みたいな事が可能になります。
代入演算子は最低二種類必要で
Inner& operator =(const T& value); // a[i] = value
Inner& operator =(const Inner& rhs); // a[i] = a[j]
二つ目を実装しないと暗黙のコピー代入演算子が作られてしまい
a[i] = a[j]; のような代入操作は実質空文化します。(owner/indexがコピーされるだけ )
素人の思いつきですがサクっと試したら機能しました。
もっとスマートなやりかたもあるでしょう。
697デフォルトの名無しさん
2019/12/07(土) 12:55:02.34ID:vGCb4aWc 意味の無い所で無駄にコードサイズを増やさなくても
普通にset/get関数で良いよ
普通にset/get関数で良いよ
698デフォルトの名無しさん
2019/12/07(土) 13:20:15.07ID:euj2mOhA setterの戻り値はvoid?this参照?
699デフォルトの名無しさん
2019/12/07(土) 13:22:21.40ID:cPeMBqq7 bitsetは参照返すからset(1).set(2).set(10)などと連鎖できる。
700デフォルトの名無しさん
2019/12/07(土) 13:35:21.54ID:QAzyzpfC701デフォルトの名無しさん
2019/12/07(土) 13:36:49.02ID:hSwO/YRY これがC++er流の挨拶です
702デフォルトの名無しさん
2019/12/07(土) 13:37:29.36ID:QAzyzpfC703デフォルトの名無しさん
2019/12/07(土) 13:38:45.35ID:QAzyzpfC >>678
今ごろlock_guardて ID:zfbHpqVT 並の情弱かオマエww
今ごろlock_guardて ID:zfbHpqVT 並の情弱かオマエww
704デフォルトの名無しさん
2019/12/07(土) 13:44:27.19ID:QAzyzpfC パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
出てこい知障
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
出てこい知障
705デフォルトの名無しさん
2019/12/07(土) 13:49:37.66ID:cPeMBqq7 そもそも10を代入して値が10にならないなら、意味的に組み込み型の整数とは違うのかもしれない。
整数ではないものを整数で代用したときに起きる問題なのかも。
整数ではないものを整数で代用したときに起きる問題なのかも。
706デフォルトの名無しさん
2019/12/07(土) 14:40:05.37ID:gqZSFnI2 効いてる効いてるw
弱い犬ほどよく吠えるねえ
弱い犬ほどよく吠えるねえ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【テレビ】25年ぶり復活「炎のチャレンジャー」南原清隆&菊池風磨がMC 懐かし「電流イライラ棒」も [湛然★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 中国「捜索レーダー起動は各国の通常の手法」 火器管制用か回答せず [蚤の市★]
- 千葉県民だけどなんか地震あったらしいな
- ぺこーら、地震で同僚が次々配信を止めるなか強行し続けるので悪目立ちするwww [268244553]
- 高市総理、睡眠時間30分😢
- 秋田大学のホームページがつながらなくなって1日以上経つのだが
- 【速報】高市早苗、起床 [779938112]
- 共産党議員「日本は中国を侵略した歴史がある」→ネトウヨ「そんな歴史は無い!捏造するな!!国家侮辱罪で逮捕だ!!!」 [314039747]
