1 名前:デフォルトの名無しさん [2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net] 何にも知らない0からの出発、超初心者のためのC++相談室
809 名前:デフォルトの名無しさん mailto:sage [2024/03/12(火) 21:19:48.50 ID:irRbCjS4.net] あるいは要素数がコンパイル時に決まらないなら std::anyをコンテナに入れるとか?
810 名前:デフォルトの名無しさん mailto:sage [2024/03/12(火) 22:11:10.08 ID:lzPsc8Dg.net] はい、要素数はコンパイル時に決まらないのでstd::anyのコンテナですかね で要素を取り出すときは、どの型なのかをチェックして挙動を...
811 名前:はちみつ餃子 mailto:sage [2024/03/12(火) 23:03:39.03 ID:WtXn1sYk.net] もし >>807 の T の種類が限られているのなら std::variant を使ったほうが楽かもしれない。 std::visit を使えば型の種類ごとに処理を切り替えるのが便利なことがある。
812 名前:デフォルトの名無しさん mailto:sage [2024/03/23(土) 11:43:27.62 ID:YZ3MX9tD.net] std::remove()ってファイルを消去する関数なんですね std::move()と名前が似ているのに全然違う
813 名前:デフォルトの名無しさん [2024/03/23(土) 12:38:58.15 ID:6dCwgWlj.net] 名前空間か関数名にfileくらい入れとけって思うよね
814 名前:デフォルトの名無しさん mailto:sage [2024/03/23(土) 12:50:26.95 ID:epZulncV.net] C言語以前にE言語の問題や さすがにそのくらいの英語の勉強はしておけと思う
815 名前:はちみつ餃子 mailto:sage [2024/03/23(土) 12:51:15.85 ID:szITgpvT.net] C の規格から取り込んだものだから由来が違うんだよ。 今なら std::filesystem::remove があるからこちらを使うほうが良い作法だと思う。
816 名前:デフォルトの名無しさん [2024/03/23(土) 12:54:13.64 ID:aQWBK6SI.net] >>812 >std::remove()ってファイルを消去する関数なんですね std::remove()ってSTLのstd::removeじゃなく? ちゃんとコンテナの要素をre-moveしてると思うが?
817 名前:デフォルトの名無しさん mailto:sage [2024/03/23(土) 13:38:01.48 ID:qgcdIGgP.net] >>816 だよねえ?? >>812-815 が何を言ってるのか分からなくて怖い
818 名前:デフォルトの名無しさん mailto:sage [2024/03/23(土) 13:40:27.68 ID:qgcdIGgP.net] ああ <cstdio>に int remove( const char* pathname ); ってのがあるのか https://en.cppreference.com/w/cpp/io/c/remove
819 名前:デフォルトの名無しさん mailto:sage [2024/03/24(日) 05:14:16.83 ID:DBUI72Gl.net] >>815 なるほど。諸般の事情でC++14な環境で、ファイルを扱う関数を探していたら。 Boostに行く手もあるかもしれませんが、とりあえず。
820 名前:デフォルトの名無しさん mailto:sage [2024/03/24(日) 09:50:29.58 ID:FsPOi81N.net] cstdio のは std:: 名前空間じゃないよね. ::remove だと思うけど
821 名前:はちみつ餃子 mailto:sage [2024/03/24(日) 12:13:25.60 ID:iaJ2USO3.net] >>820 cstdio にある関数は std 名前空間にある。 ただしグローバル名前空間「にも」あって良い。 (無くても良い。) stdio.h の場合はグローバル名前空間で宣言されるが std 「にも」あってよい。 (無くても良い。)
822 名前:デフォルトの名無しさん mailto:sage [2024/04/14(日) 11:55:59.92 ID:Rac57Bvn.net] ヒエッ……、、、ぎ、玉虫色……
823 名前:デフォルトの名無しさん mailto:sage [2024/04/20(土) 14:55:18.13 ID:nh5GJjX6.net] 言語そのものではないのですが、コマンドラインのデバッガやIDEでSTLのコンテナの内容を 易しく表示してくれるのってありますか? 例えばvectorなら、単純に中の要素だけを列挙してくれたりとか ビルドにCMakeを使っているのでとりあえずCLionを使っていますが、これは 確かに変数の中身をリスト構造で見れますが、変数内の生のメンバー(M_なんちゃら等) 見えてる感じで、STLコンテナに関してはあまり親切ではないような デバッグの際は見えた方がいい場合もあるのでしょうが。なら表示が切り替えられたりとか? 自分はmacOSですが、他のプラットフォームにしかないものも参考に聞いてみたいです
824 名前:デフォルトの名無しさん [2024/04/26(金) 10:53:44.71 ID:kftlKAnq.net] 今からC++を勉強するならC++20を基準にやっても構いませんか?
825 名前:デフォルトの名無しさん mailto:sage [2024/04/26(金) 10:59:40.04 ID:/+TxHGye.net] c++20といわずc++23からやればいいのでは
826 名前:デフォルトの名無しさん mailto:sage [2024/04/26(金) 11:15:59.06 ID:kftlKAnq.net] 最新の規格で勉強して必要に応じて古い知識をつけていくような学び方でいいの?
827 名前:デフォルトの名無しさん mailto:sage [2024/04/26(金) 12:03:42.74 ID:q/vvVdAs.net] つべこべ言わずやれ 最短コースなんてない
828 名前:デフォルトの名無しさん mailto:sage [2024/04/26(金) 13:37:23.03 ID:+usxQk3U.net] C++ は基礎の上に段階的に応用が乗っかっているような綺麗な構成ではない。 全部が入り組んで捏ねまわされてグダグダや。 そんでもってクソ巨大やねん。 どこから入っても同じ。
829 名前:デフォルトの名無しさん mailto:sage [2024/04/27(土) 18:08:12.52 ID:nxPk0zOn.net] 質問なのですが std::string には std::to_string(int)他の簡単文字列化関数がありますが std::basic_string<T> に対する簡単文字列化関数はどう?
830 名前:デフォルトの名無しさん [2024/04/27(土) 21:15:22.77 ID:Zg+tfmdX.net] >>823 WindowsのVisual Studioではできる
831 名前:デフォルトの名無しさん [2024/04/28(日) 10:47:20.65 ID:xKAeYuwJ.net] 最初に学ぶ言語がC++なら、Cより学ぶのが大変じゃん
832 名前:832 mailto:sage [2024/05/11(土) 19:13:43.45 ID:RotYKdRC.net] やっぱ数値からstd::basic_string<T>の文字列への変換とかTが決まらないとやり方がわからないから std::basic_string<T>でそれをやりたい人が対応せよ(std::basic_string<T>版to_string()やstd::ostrstreamをT毎に作成せよ)という天の啓示? 証拠にstd::wstringについてはstd::wstring to_wstring(int)とかstd::wostrstream とかある
833 名前:デフォルトの名無しさん mailto:sage [2024/05/13(月) 23:37:45.97 ID:E3c8DTgZ.net] >>832 分かっとるやないか
834 名前:デフォルトの名無しさん [2024/05/17(金) 02:48:48.77 ID:5PkVcelB.net] OS上で動かすアプリ作りたくなったからC++とC#で悩んだんだけどどちらの長所も捨てがたい気がして両方学んでみるかな?って思ったんだけどC++でのおすすめの参考書とかあります? 一応、学生時代にC言語で五目並べとファイルの出力までは勉強してます。 一応ググって入門参考書とか調べましたがちょっとC言語齧ったのなら実戦的な例題集みたいなのが良いのでしょうか? あとこの質問スレ違いだったらすいません。
835 名前:デフォルトの名無しさん mailto:sage [2024/05/17(金) 09:33:44.70 ID:7hVV19/y.net] Windows上のアプリをC++で作るのは少々ハードル高いが 個人的にオススメなのはWindows2000 プログラミング標準講座(ハーバート・シルト著)ってやつ C++そのものの本は他の人が挙げてくれると思う
836 名前:はちみつ餃子 mailto:sage [2024/05/19(日) 01:34:46.93 ID:lh74nkjR.net] どういう学び方が良いかは人による。 C++ の設計思想としては理解できた便利機能をその都度に導入する形で学んでいけるようにという配慮はしていると設計者は言っている。 実務でプログラミングをしてる人は「C++ をちゃんと習得するまで待ってくれ。 仕事を止めてくれ」とは言えないからね。 C を理解しているならとりあえず C のように書きながら部分的に C++ 的にしていける。 つまり実戦的な学びかたも一応はアリ。 ただ、実戦的な学習はやりたいことが出来てるならそれ以上深掘りする意欲につながらない。 C の書き方でやれるなら別の形に積極的に書き直したい理由って何?と感じてしまうことがある。 きちんとした理解に至らぬままの中途半端な形になりがち。 やりたいこと (書きたいもの) が明白なほうが道筋は付けやすいんだけど、やりたいことに邁進しすぎてもそれはそれで「学習」としてはイマイチなんだよ。 そのへんは程度問題というか匙加減というか、人による、場合によるとしか言いようがない。 個人的にはしっかりとした理屈っぽい入門書を一冊は読んでから方針を決めればいいと思ってる。
837 名前:デフォルトの名無しさん [2024/05/19(日) 14:09:52.90 ID:y+g7UiM3.net] >>835 レス、ありがとうございます Windows2000 プログラミング標準講座が近所の図書館にもなかったのでそこにある蔵書読んでみてVisual studio使ったプログラミングしたことないからそれをツールとして使った入門書でいいかな?って思ってしまいました。 >>836 レス、ありがとうございま。。 何を作りたいかの方向性でそれに使うものだけ勉強すれば速いというのはわかります。 自分的には作りたいアプリもあるけどまずGUIアプリを作るための基礎からやりたいなと思ってます。 理屈っぽい入門書の理屈っていう部分はプログラムのハードでの処理の考えとかかと思ったのですがそれはたぶん理工系の学部行ってたので通信情報の基礎理論は聞いたことあるので大丈夫だと思います。 C++は基礎わかってれば後は組み込みたい機能のコードを探せばいいってことと解釈してコード集みたいな辞典を使ったり、ネットで調べたりすればいいってことでいいのでしょうか?
838 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/05/19(日) 15:08:47.80 ID:lh74nkjR.net] >>837 私がいう「理屈」は言語仕様のことのつもりで言ってた。 低レイヤから入った C ユーザーは C を使えているようでも言語仕様に対する理解が浅くなりがちで、 良くも悪くも機械語 (ハードウェアの挙動) と対応づけて考えてしまうところがある。 言語としての抽象とその実装は分けて考えないといけない。 現代的なコンパイラは最適化がメチャクソに賢いので実際に生成される機械語と一対一には対応づかないし、 言語仕様で未定義としているところを踏んだらわけのわからない動作を引き起こすので 言語仕様について一定以上には身に付けてから実践を始めないと何がなんだかわからないことだらけだと思う。 逆に一定以上に C++ の基礎を身に付けてからならあとはリファレンスを見ながらでも行けるけれど、 今の C++ の「基礎」は昔の C++ と比べるとかなり巨大になってしまっているので当初の C++ の設計思想のように C から段階的に C++ を身に付けるってのはあまりお勧めできないと私は考えてる。 C++ はとにもかくにも巨大で言語機能はお互いに絡み合っているので部分ごとの理解なんて出来ないんじゃないかということ。 繰り返すけど、人による。 自分なりにどういう方向性で行ったらいいのか判断するためにはどこからでもいいから一旦は始めたらいい。 どうせまったく躓きなく進むなんて出来ないんだから駄目だったときにどこが駄目だったかを検討して 軌道修正するしかしょうがないんじゃないのかな。
839 名前:デフォルトの名無しさん mailto:sage [2024/05/19(日) 15:25:20.86 ID:TV8v+5zc.net] >>837 一応Amazonで中古が出てる 最近の本を知らないのでなんとも言えんのだけど、 Visual Studioと名のつく本は、開発環境(VisualStudio)依存の機能使いまくりで他で応用が効かないんだわ、本を選ぶときの参考にしてくれ (開発環境に依存しまくりでいいなら、ぶっちゃけC#のがはるかに楽) >>835 はWin32APIやメッセージループとかの「ずっと変わらない基本」をちゃんと教えてくれる本として挙げた
840 名前:デフォルトの名無しさん [2024/05/19(日) 19:24:07.63 ID:y+g7UiM3.net] >>838 言語仕様ですか 私自身、自分はハードを動かすためにCやアセンブラ触った口だから多分それに該当しそうです。 >>839 ちょっと気になったのですがハーバート シルト(著)の標準講座C++とか独習はどうなのでしょうか? ハーバート・シルト氏の著書を少々調べてみたのですがどれも人によっては難しいとコメントあるけど素晴らしい学習書という人が多いみたいでしたので
841 名前:はちみつ餃子 mailto:sage [2024/05/19(日) 20:21:36.73 ID:lh74nkjR.net] >>840 C++ の仕様は不変なわけではなくてたまに改定してるというのは考慮に入れる必要がある。 どの仕様かを言うときには改定年度を付けて表す通例があって、現時点では C++98, C++03, C++11, C++14, C++17, C++20, C++23 がある。 入門レベルなら最新を積極的に追うほどの必要はないけど、最低限度は C++11 だと思う。 改定の期間があいたせいでインパクトの大きい変化があった。 それより古い書籍は良書だとしても現状に合わないところは色々とあるかもしれない。 GCC や Clang は特に指定しなければ C++17 モードのようなので現時点の基本は C++17 くらいというのが一般的な認識なんじゃないかな。
842 名前:デフォルトの名無しさん mailto:sage [2024/05/19(日) 21:02:45.49 ID:TV8v+5zc.net] あーそういや独習書いた人だっけ 独習は定番レベルで評価高い、ある程度Cの知識は前提になるけど読めると思う C++標準講座は読んだことないのでわからんすまん
843 名前:1 mailto:sage [2024/05/29(水) 05:15:45.12 ID:fgEqna2o.net] なに?プログラムって。むつかしそうだなー ぜんぜん知らないんだけど、ちょっとやってみたいなー ってな人も、入れてあげてね。 そういうスレなんだから。
844 名前:デフォルトの名無しさん [2024/06/11(火) 02:11:04.90 ID:T9Og4Yet.net] 質問です。 独習でc++勉強してるのですが掛け算して出力するっていう練習問題見ててふと気づいたのですがこの本一体どの文字コードで保存すること考えて書いてるんだ?っていう疑問が出てきました。 sjisだとちゃんと日本語表示されるけど汎用性ないよな?ってことでUnicodeで書くこと前提で勉強したほうがいいよなって思ったんですが下のコードだと何を直せばいいのでしょうか? #include <iostream> using namespace std; int main() { double hours, wage; cout << "労働時間を入力する: "; cin >> hours; cout << "時給を入力する: "; cin >> wage; cout << "合計賃金は" << wage * hours << "円\n"; return 0; }
845 名前:はちみつ餃子 mailto:sage [2024/06/11(火) 05:44:39.09 ID:oZDOZRBo.net] >>844 データの型としては unicode を扱えるようになってるけどコンソールは言語の外の話なので Unicode を扱えるかどうか、使えるにしてもどう切り替えるのかは言語仕様としては決まってない。 Unicode で出力は出来るけどそれを理解して表示できる環境かどうかはわからないということ。
846 名前:デフォルトの名無しさん mailto:sage [2024/06/11(火) 10:47:36.44 ID:GrH0S5VC.net] 実行環境を変える setlocale()するとか
847 名前:デフォルトの名無しさん [2024/06/11(火) 15:21:46.44 ID:T9Og4Yet.net] >>844 つまり、自分のところの文字エンコード使えってことでしょうか? 動作的には目的通りできますし、環境次第で文字表示はどれ使えるか変わってくるしで >>846 実行環境はこの環境で使えるプログラム組めるまで気長にやるつもりなのでなしです。 setlocale()使ったことないのでよくわからないのですがロケール宣言してその中で日本語使ってみたらってことですか?
848 名前:デフォルトの名無しさん mailto:sage [2024/06/11(火) 16:20:37.40 ID:ILw6YbJs.net] 長らくVS触ってなかったんであまり役に立たんかもしれんけど ・Visual Studioでutf-8でソース書く方法 tech.hikware.com/article/20171020a.html ・Win32APIをutf-8で使う https://learn.microsoft.com/ja-jp/windows/apps/design/globalizing/use-utf8-code-page C++標準ライブラリに関してはロケール設定でいけるんじゃなかったっけ、違ってたらすまん
849 名前:デフォルトの名無しさん mailto:sage [2024/06/11(火) 16:33:04.86 ID:ILw6YbJs.net] https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-170 下の方にsetlocaleでutf-8指定する方法書いてる で、ソースコードもロケールもutf-8になってりゃ>>844 のコードそのままでutf-8で実行してくれるはずよ
850 名前:デフォルトの名無しさん mailto:sage [2024/06/11(火) 16:50:13.04 ID:ILw6YbJs.net] https://learn.microsoft.com/ja-jp/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-170 すまん、実行時もソースコードもオプションに/utf-8入れるだけだったわ setlocaleしなくていい utf-16にしたいんだったらまた別だけど
851 名前:はちみつ餃子 mailto:sage [2024/06/11(火) 17:31:31.68 ID:kKWOd8Cb.net] >>847 言語仕様には書いていないことだから実行環境 (OS やターミナル) のドキュメントを読んでねってこと。 色々な文字コードをサポートしていることもあるししてないこともある。 切り替えることが出来ることもあれば出来ないこともある。 それとストリームはリダイレクト (接続先の変更) される可能性がある。 やりたいことによっては 標準出力がターミナルに繋がっているときとファイルに繋がっているときを区別しなきゃならないかもしれない。 Unix 系 OS の場合はテキストを表示するのはターミナルで、ターミナルはごく普通のアプリケーションのひとつ。 OS 自体はアプリケーションとターミナルの仲立ちをしてるだけなんだけど……。 Windows の場合は標準のテキスト画面 (コンソール) は Windows に標準的に備わった特別なもの。 その特別なテキスト画面を使ってる間は Windows のドキュメントに書いてある通りにすればいいのだけど Windows で別のターミナルを使うときはその制御方法の規格が確立してないから 主要なターミナルを判定して場当たり的な処理をしているのが現状。 近年は ConPTY という規格が使われ始めてるけどどんなターミナルもそれをサポートしているってわけではないから 結局は場当たり的に対処すべき対象が一個増えただけって感じ。 (将来的には統一されるといいなぁ……) 更に Windows は C ランタイムサポートが文字コード変換の機能も持っていて接続先を勝手に判定して 変換することがあって、その挙動がかなりわけがわからない。 色々あるけどまとめると「こうすればいい」という簡単な説明が出来ない入り組んだ事情があるって話。
852 名前:デフォルトの名無しさん [2024/06/11(火) 22:55:22.54 ID:T9Og4Yet.net] すいません。 私の環境ただ単にUTFが使用可能になってなかっただけでした。
853 名前:デフォルトの名無しさん [2024/06/12(水) 16:16:19.83 ID:HDPWhZcO.net] termcap/terminfoとか init.d inittab getty
854 名前:デフォルトの名無しさん [2024/06/13(木) 02:54:21.20 ID:PAaiBuyr.net] 人間に匹敵する知能を持った汎用人工知能を開発した研究者に総額100万ドルの賞金を授与するコンテスト「ARC Prize」が開催
855 名前:デフォルトの名無しさん [2024/06/15(土) 17:34:41.45 ID:kg6WNOQa.net] >>844 C++は、日本語対応していないよ、注意してね。 だから、"あいうえお"なんかのコードは実行されない。 俺はこれを理解するのに10年以上かかった。
856 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/06/15(土) 19:41:12.56 ID:g9ixUcaw.net] >>855 No. 現在は Unicode についての規定はあるし、 Unicode のコードポイントに対応つくことが保証された文字列リテラルはある。
857 名前:858 mailto:sage [2024/06/15(土) 21:31:29.30 ID:kg6WNOQa.net] 俺のエディタは、EmEditor Professional (64-bit)だ。 だ。だからC++は、C++17だ。 わからなかった。ごめんな。
858 名前:デフォルトの名無しさん [2024/06/16(日) 00:50:11.77 ID:v0fD0nKy.net] C++と文字コードに関してはこの記事が面白かった https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b 俺もあまり詳しくはないから全部理解できた訳じゃないけど、筆者の人がブチギレまくってるのを感じ取るだけでも面白かった
859 名前:デフォルトの名無しさん mailto:sage [2024/06/16(日) 23:06:40.05 ID:+HL215mo.net] >>854 どうやってチューリングテストするんじゃ……
860 名前:デフォルトの名無しさん mailto:sage [2024/06/16(日) 23:21:48.48 ID:+HL215mo.net] coutやcinとかなiostream系の入出力手段のうちのワイド文字でないやつは エスケープ文字('\\'とか)や書式指定文字('%'とか)に依存しないから つまりたまたまマルチバイト文字の一部が '\\' や '%' に一致してもなんら実害が無いから Shift JISの入出力が問題を引き起こすことは無いという認識でおk?
861 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/06/16(日) 23:45:30.66 ID:Crm/SwBu.net] >>860 言語仕様的にはテキストモードでは実行環境の都合で各種の変換を入れても良い。 (入れなくても良い) 実際に Windows では文字コードや改行コードの変換をする。 改行が \r\n であるようなテキストを読んでも内部的には \n であるように扱えたりしてるのを不思議に思ったことない? 変換するということは変換元が想定通りじゃないときには破綻する可能性がある。 Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。 バイナリモードではバイト列そのまま。 Linux だとテキストモードとバイナリモードは区別がない。
862 名前:デフォルトの名無しさん mailto:sage [2024/06/17(月) 00:54:42.78 ID:pXzMaPAe.net] >>861 だいたいわかりた、 >実際に Windows では文字コードや改行コードの変換をする。 テキストモードにおける '\n' <--> '\r\n' 変換をやるだけでも、 cout << "アイウエオカキクケコ\nさしすせそ" << endl; と書かれたうちの '\n' と endl の2箇所だけ正確に変換するためには、 上記1行の中に暗黙に含まれるSI/SOおよび2バイト文字の「区」を表す上位バイトを 「実行時に」解釈する必要がある つまりランタイムはASCIIのつもりで文字列を解釈しては駄目で、 Shift JISというものを知っている必要があり、これが >Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。 につながるんだと思う。
863 名前:デフォルトの名無しさん mailto:sage [2024/06/17(月) 00:57:00.44 ID:pXzMaPAe.net] しかし >実行環境の都合で各種の変換を入れても良い。 とC++の仕様には書いてあると言っても実際には透過的でない文字コード変換とか有り得ないんでないので? 例えば ofstream ofs("foo.txt"); ofs << "アイウエオカキクケコ\nさしすせそ" << endl; // (1) std::string s1, s2; ifstream ifs("foo.txt"); ifs >> s1 >> s2; // (2) とやったらs1、s2とも中身は(1)の記述をコンパイル時に解釈した通りになる、 という期待動作しかありえないのでは…… 具体的には s1の中身は SI アイウエオカキクケコ SO の12バイト(末尾NUL除く)になって、 s2の中身は さしすせそ という10バイト(末尾NUL除く)になる、
864 名前:デフォルトの名無しさん mailto:sage [2024/06/17(月) 01:13:07.47 ID:pXzMaPAe.net] いやトチ狂ったスマンヌ、 Shift JISの2バイト文字は上位下位ともコントロールコード('\r' や '\n' を含む)とはバッティングしないから >>862 の理解はやや的を外していた……orz テキストモードにおける '\n' <--> '\r\n' 変換は、ランタイムがShift JIS文字列をASCIIとして解釈してそれを行っても何ら問題を生じない。 しかし、であればやっぱ>>860 に戻って、実は実害無いのでは…… Shift JISの2バイト文字は上位下位とも数字とかともバッティングしないようになっているし…… 透過的でない文字コード変換(>>863 )が無い限り、cout して cin して結果が変になるケースが思いつかなsげ…… (正確には char c; cin >> c; で 2バイト文字 "陰" の2バイト目を "A" として受け取ってしまう、系の避けようが無い事故は除く
865 名前:デフォルトの名無しさん [2024/06/17(月) 16:31:20.06 ID:prlYSpwu.net] wstringがutf-32だったら良いのに
866 名前:デフォルトの名無しさん mailto:sage [2024/06/18(火) 11:56:24.49 ID:mldi07Wv.net] >>858 その人ブチギレてるフリしてるだけの厨二病だから・・・
867 名前:デフォルトの名無しさん mailto:sage [2024/07/17(水) 14:22:34.59 ID:UFGYctg0.net] std::functionって関数の「比較」はできないんでしたっけ? 例えばあるクラスが std::function<..> m_callback みたいなインスタンス変数を持ってて そこにコールバックを登録できるメソッドがあるとします registerCallback(std::function<..>& callback) { m_callback = callback; } みたいな で、registerCallback(func)が呼ばれた後、正しいコールバックが保持されていることをテスト したいのですが、例えばregisterCallback()の引数に渡したstd::function<..>のオブジェクトと m_callbackはどうしたら比較できるでしょうか。単純に == ではエラーになる模様です
868 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/07/17(水) 16:12:07.26 ID:rcKIBlXh.net] >>867 メンバ関数テンプレート target を使えば元の関数を取り出せる。 https://wandbox.org/permlink/3sCREueD2sVYMW9t ただし、取り出すときに元の型を指定する必要がある。 ただの関数ならば簡単なのだけれど、 ラムダ式から直接に入れた場合には適切な型を指定できない。 ラムダ式が生成する値はそれぞれに固有の型を持つので。 一旦 std::function に入れたらあまり取り出さない (取り出す必要がない) 設計が望ましいと思う。 テストのためだけなら大丈夫だと思うけど。
869 名前:デフォルトの名無しさん mailto:sage [2024/07/19(金) 12:25:52.15 ID:HkXmecYp.net] functionではなくオーバーロードで生の関数や関数オブジェクト(ラムダ含む)を受け取って、functionと共にアドレス値を保存すればいいのでは 関数オブジェクトの場合はoperator ()のアドレス
870 名前:デフォルトの名無しさん [2024/07/21(日) 02:13:54.03 ID:5YGWxq2c.net] 独習でc++を勉強していて時々プロセッサとかライブラリ関数これなんだろ?になるのですがそういうの調べる辞典的なものってあるのでしょうか? あるのでしたらおすすめのもの教えてもらえませんか
871 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 02:27:27.18 ID:neWsPxIF.net] C++標準に関しては https://cpprefjp.github.io/ https://ja.cppreference.com/w/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 プラットフォーム固有のものに関してもそれぞれあるけど 関数名でググったら大抵上の方に出てくるとおも
872 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/07/21(日) 08:39:43.55 ID:uupG6eva.net] ググって出てくるようなのは誤った記述も多い。 あまり信用しすぎずになるべく複数の情報源を持つのが好ましいと思う。 言語仕様は改訂もあるから資料の日付を見てどの版に対応するのかも意識する必要がある。 >>871 が示すような有志がまとめているサイトはちょっとした企業よりも高いモチベーションがあるのか質は高い。 本当にありがたいサイトなので役に立ったと思ったらちょっとくらいは寄付してあげてね。
873 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 12:22:32.16 ID:qC5USrOr.net] Unix環境ならmanは割と手軽で良い
874 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 15:22:13.51 ID:neWsPxIF.net] いや、プラットフォーム固有って言ったのは Microsoft Learn(旧MSDN)とかApple Developerとかのことやぞ
875 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 16:05:28.79 ID:neWsPxIF.net] 安価忘れてた、>>872 ね 複数の情報源持つべきとかは同意するけど プラットフォーム固有のは公式が一番信用できるに決まってる(ただMicrosoftのは機械翻訳になってから日本語版がアレだけど・・・)
876 名前:デフォルトの名無しさん [2024/07/21(日) 19:10:23.03 ID:5YGWxq2c.net] >>871 >>872 ありがとうございます。 やっぱ、ググって調べるのが一番なんですね。 ただ、C++と言いつつほぼCの内容で紹介してて本でやってる課題とこの関数の使い方知りたいでなんか食い違いあったんですがここわかりやすそうなので助かります。
877 名前:デフォルトの名無しさん [2024/07/21(日) 21:04:50.60 ID:D0FAs2Ah.net] cpprefjpはなんかTシャツ作るらしいから記念に買うわ https://github.com/cpprefjp/site/issues/1296
878 名前:デフォルトの名無しさん mailto:sage [2024/07/21(日) 21:06:26.85 ID:neWsPxIF.net] 手元に置いておく辞典系の本があっても良いと思うけどちょっとお勧めできるものを知らない・・(C++11より前のものしか買ったことない) 秋葉原とかの技術系の書店で手に取って読んでみるのがベストなんだけどねぇ
879 名前:デフォルトの名無しさん [2024/07/23(火) 01:20:07.66 ID:Rfg4Mjqa.net] >>877 誰得
880 名前:デフォルトの名無しさん mailto:sage [2024/07/25(木) 15:13:06.50 ID:kulC2cnH.net] >>879 1万円くらいで転売しようと考えています
881 名前:デフォルトの名無しさん mailto:sage [2024/07/29(月) 05:00:32.70 ID:ycfafYuZ.net] >>871 の https://cpprefjp.github.io/ 、単発寄付が、簡単にできたらなーと、惜しくなった。
882 名前:デフォルトの名無しさん mailto:sage [2024/08/01(木) 04:44:09.33 ID:ZgmEa4OS.net] unordered_map の extract というのはC++17以降でしか使えないのですか
883 名前:デフォルトの名無しさん mailto:sage [2024/08/01(木) 09:34:34.68 ID:jWmufzw0.net] >>882 https://cpprefjp.github.io/reference/unordered_map/unordered_map.html 対応バージョンがC++17ってなってるね
884 名前:デフォルトの名無しさん mailto:sage [2024/08/02(金) 22:37:31.58 ID:8YStqjv0.net] ここでGoogleTestの質問をしてもよろしいでしょうか?
885 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 12:54:37.69 ID:jHE0rxct.net] 質問なのですが派生とshared_ptr<T>を組み合わせたときに、 class Base { int m_x; protected: // Baseクラスのコンストラクタはprotected Base(int x) : m_x(x) { } virtual ~Base() { } // 仮想関数にしてもしなくても同じ下記現象 }; class Derived { public: // 派生クラスのコンストラクタはpublic Derived() : Base(10) { } }; std::shared_ptr<Base> pBase(new Derived()); とやったら error C2248: 'Base::~Base': protected メンバー (クラス 'Base' で宣言されている) にアクセスできません。 と言われるんだけどなんで?その判定要る??
886 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 12:56:00.59 ID:jHE0rxct.net] 自己解決しますた 文句が言われているのはBaseのコンストラクタでは無くてデストラクタか……orz
887 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 14:08:27.06 ID:dHG4OJIq.net] 本当に解決したの? それDerivedがBaseを継承していないよ?
888 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 15:33:06.74 ID:jHE0rxct.net] あっはい class Base { int m_x; protected: // Baseクラスのコンストラクタはprotected Base(int x) : m_x(x) { } pulic: // Baseのデストラクタをpublicに修正 // (1) virtual ~Base() { } }; class Derived : public Base { // 誤記訂正 // (2) public: // 派生クラスのコンストラクタはpublic Derived() : Base(10) { } }; std::shared_ptr<Base> pBase(new Derived()); // (3) (1)で解決、(2)は誤記訂正 文句言われたのがBaseのコンストラクタだとすると(3)においてDerivedのインスタンスがshared_ptr<Base>に渡される時点で呼び出し済なので
889 名前:デフォルトの名無しさん mailto:sage [2024/08/04(日) 15:35:40.71 ID:jHE0rxct.net] (3)でコンパイルエラーになるのは辻褄があわなくね?!と思った次第 文句言われたのがBaseのデストラクタだったからだいたい理解すた (std::shared_ptr<Base>はあくまでBaseしか知らないから、Base::~Base()がpublicでなかったら 呼べないという解釈でエラーにするのは当然な可能性
890 名前:デフォルトの名無しさん mailto:sage [2024/08/05(月) 09:26:19.70 ID:SHyTm/CM.net] std::unordered_map<std::string, std::unique_ptr<int>> map があった時のmapの管理について 教えてください この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は foo = std::move(map["hoge"]); としないといけない? で、moveしたあとは hogeに対する値は無効になっちゃってますよね。ということは 自分で消さないといけない? map.erase("hoo")とかで
891 名前:デフォルトの名無しさん mailto:sage [2024/08/05(月) 12:50:07.44 ID:Gb5pye15.net] >>890 >この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は >foo = std::move(map["hoge"]); としないといけない? 「値を取り出す」をどういう意味で使っているかによる 単に中身を読むだけならmoveしなくても良い
892 名前:はちみつ餃子 mailto:sage [2024/08/05(月) 12:51:26.12 ID:cmuXon6W.net] >>890 その考え方で正しい。 std::unique_ptr をムーブすると抜け殻のほうのオブジェクトは nullptr を指すようになることは保証されるが、 そのスマートポインタ自体が std::unordered_map から勝手に消えたりはしない。 消えて欲しいならそのための操作は必要。
893 名前:はちみつ餃子 mailto:sage [2024/08/05(月) 12:53:54.43 ID:cmuXon6W.net] std::unique_ptr 自体はコピーできないがそれが指しているオブジェクトを読むだけなら出来るしコピーすることも出来る (コピーコンストラクタを削除していないなら) 。
894 名前:デフォルトの名無しさん mailto:sage [2024/08/06(火) 11:13:46.48 ID:SBxTyrdX.net] Rust使おうず
895 名前:デフォルトの名無しさん [2024/08/06(火) 12:55:07.35 ID:7fXoqzm8.net] いらね
896 名前:デフォルトの名無しさん [2024/08/12(月) 00:31:08.71 ID:YAf3BhD8.net] 標準講座C++―基礎からSTLを利用したプログラミングまで 新装版 ハーバート シルト著が気になったのですがこれで勉強したことある方いますか?
897 名前:はちみつ餃子 mailto:sage [2024/08/12(月) 01:07:19.65 ID:CLy07uUA.net] >>896 読んだことは無いけど 2009 年発売ってのは微妙な部分かもと思う。 2011 年の言語仕様改定がインパクトの強い変更を含んでいて基本的な書き方の習慣に大きな変化があった。 そこらへんの事情が含まれない本だと現状にそぐわない。
898 名前:デフォルトの名無しさん mailto:sage [2024/08/12(月) 03:05:00.33 ID:LOlm/bL8.net] weak_ptrが処理の途中で解放されてしまうのを防ぐために lock()を呼んでshared_ptrを 取得してから処理、というのがありますが、 lock()を呼んだ時点で既に解放されていることもあるわけですよね? 確かにlock()の戻り値をチェックして不正な呼び出し等を防げるのはありがたいのですが、 そもそもオブジェクトが既に解放されているのは残念といいますか。 lock()を呼んでからする処理の場所に来るまでに解放されないようにしたい、と思った場合、 どうしたらよいのでしょうか? もしかしてそもそもweak_ptrを使うな、ということになります?
899 名前:デフォルトの名無しさん mailto:sage [2024/08/12(月) 03:59:48.65 ID:ArETDaeV.net] あいまいな言葉よりコード見せてみ
900 名前:デフォルトの名無しさん [2024/08/12(月) 08:49:28.44 ID:+jMHtzbv.net] 既に寿命が切れてる場合はlock() が無効な shared_ptr を返すのでそれで判定する lock() を呼んだ後は戻り値の shared_ptr が寿命を伸ばすので問題ない shared_ptrは「有効なshared_ptrが1つ以上ある間はオブジェクトの寿命が消えない」ものなので、lock() が返すshared_ptrを保持してる間は消えないよ lockを「weak_ptrからshared_ptrへの昇格を試みる」ものと考えても良い lockしたい箇所の時点で必ずオブジェクトが生きていて欲しいなら、それはweak_ptrでなくshared_ptrを使うべき
901 名前:デフォルトの名無しさん mailto:sage [2024/08/12(月) 10:20:21.64 ID:Lq53CINI.net] >>896 2000年くらいにSTLはこれで勉強したよ 基本的なことは網羅されているが C++の新しい仕様には対応してないので 別途学習すべし いまもっと良い本があるかは分からない C++の仕様は建て増しなので この本に書かれていることは無意味ではない
902 名前:デフォルトの名無しさん [2024/08/12(月) 13:09:35.61 ID:XQ/hRBSk.net] キメラ
903 名前:デフォルトの名無しさん [2024/08/12(月) 16:00:24.68 ID:K9Aw1MHl.net] 超初心者とは何なのか・・・
904 名前:デフォルトの名無しさん [2024/08/13(火) 01:12:06.02 ID:sOEG0OlC.net] >>897 >>901 返答ありがとうございます。 今同著者の別の本で勉強中ですが基本的なところでこれも買っとこうかな?って質問しました。 基本参考書として買ってみます。 基礎的なところ終わったら自分が作りたいプログラムに必要な現状の本でも買ってみます。
905 名前:デフォルトの名無しさん [2024/08/13(火) 01:32:59.16 ID:sOEG0OlC.net] すいません。誰か下のコンパイルオプションわかる方いますか? 解いてた問題の解答にも文字化けするって書いてあったので文字化け対策のオプションなんかないかな?って思って調べたらこのオプションで解決できるって出てたので使ってた人の入力例そのままオプション挿入してみてちゃんと解決できたから気になって調べたんですがググっても出てこなくて入力例が次の行のやつです。 g++ test.cpp -finput-charset=CP932 -fexec-charset=CP932 -finput-charset -fexec-charset
906 名前:デフォルトの名無しさん mailto:sage [2024/08/13(火) 02:09:15.07 ID:sAvdrrrS.net] >>905 https://www.google.com/search?q=%22-finput-charset%22
907 名前:デフォルトの名無しさん [2024/08/13(火) 07:27:51.38 ID:8FMmWnXe.net] ああなるほど、意図せずマイナス検索状態になってたから一件もヒットしなかったってことか あるある
908 名前:デフォルトの名無しさん mailto:sage [2024/08/13(火) 08:43:34.22 ID:6ajF2Nvb.net] >>896 シルトは有名 ロベールも有名だったけど、 C++11 に対応していないので古い STL標準講座、1999年 ハーバート・シルト 著 επιστημη(エピステーメー) 監修 この本も古い。 確か、エピステーメーはC++ の標準化委員だっけ? C++テンプレートテクニック―簡潔で再利用しやすいコードのためのC++活用術 επιστημη/高橋 晶【著】、2009 独習C++ 新版、2019/11 高橋 航平 (著), επιστημη(エピステーメー) (監修)
909 名前:デフォルトの名無しさん [2024/08/13(火) 12:38:43.84 ID:sOEG0OlC.net] >>906 >>907 ありがとうございます てか、検索でそういうことあるんですね