1 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 10:57:31.60 ID:JaaB5Egp.net] 前スレ C++相談室 part156 https://mevius.5ch.net/test/read.cgi/tech/1621389313/
809 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:28:11.75 ID:vkb7a42p.net] C++にもfinally欲しい
810 名前:デフォルトの名無しさん [2021/10/20(水) 13:30:01.90 ID:OEiI06HQ.net] fseek()/ftell()が32bit用でfseeki64()/ftelli64()の方を使ってないというオチか
811 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:36:27.87 ID:glY3n63N.net] 自信をもって断言したところで、モリカケ・桜を見る会と同じことになるだけだよ アベノセイダーズは不具合を見つけてくるまで決して許さない
812 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:39:14.76 ID:glY3n63N.net] >>789 コストラクタでラムダ式をメンバ変数に受け取りデストラクタでそのラムダ式のメンバ変数を実行するクラステンプレートを自作すれば問題解決
813 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:41:35.24 ID:NsIIvpqv.net] fseekの引数はなぜああしたんだろうね
814 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:46:56.17 ID:glY3n63N.net] 宇宙人がいないことを証明するための労力たるや
815 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:50:04.27 ID:NMVwWGr0.net] 不都合があるという主張であろうと 不都合がないという主張であろうと 自分でコード書けないゴミは引っ込んでろ
816 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 13:53:43.95 ID:glY3n63N.net] >>795 そのとおりだな、まずお前が引っ込め
817 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 14:13:30.21 ID:glY3n63N.net] 再帰呼び出し 我々の宇宙は高度な文明を持つ知的生命体の実験により作られたものであると推測するハーバード大学の科学者 : カラパイア https://karapaia.com/archives/52306877.html
818 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 14:38:01.57 ID:NMVwWGr0.net] >>796 おいURL乞食、おまえに言ってんだよ、おまえに 俺はftellで例示するコード出してんだよ 同類呼ばわりすんな穢らわしい
819 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 14:47:18.86 ID:BFKUlxpT.net] #include <iostream> #include <fstream> #include <vector> #include <cstdio> #include <algorithm> int main() { const char path[] = { "hoge.dat" }; std::vector<char> buffer(1024 * 1024); // 1MB std::ofstream f(path, std::ios::binary); for (int gb = 0; gb < 5; ++gb) { std::fill(buffer.begin(), buffer.end(), static_cast<char>(gb)); for (int i = 0; i < 1024; ++i) f.write(buffer.data(), buffer.size()); } f.close(); #pragma warning(suppress : 4996) std::FILE* fp = std::fopen(path, "rb"); for (int i = 0; i < 5 * 1024; ++i) { if (std::fread(buffer.data(), sizeof(buffer[0]), buffer.size(), fp) < buffer.size()) return 1; for (auto ch : buffer) if (ch != static_cast<char>(i / 1024)) return 2; } std::fclose(fp); std::cout << static_cast<int>(buffer[buffer.size() - 1]) << std::endl; return 0; } とりあえずVC++2019でx86(32bit)ビルドして実行したら終了コード0の出力4だったのでfread 4GBは超えられてる模様
820 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:12:34.13 ID:glY3n63N.net] >>799 それは、おま環にすぎないので不具合がないことの証明にはならない 不具合を見つけるのがお前の責務だ 赤木さんのように自○したくなるまで頑張って探せ
821 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:18:25.38 ID:BFKUlxpT.net] 今日は2つのIDで頑張ってるみたいだね
822 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:29:22.63 ID:NMVwWGr0.net] プログラム技術板の正規メンバに クソ以外の乞食が何か寝言ぬかしとんな
823 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:34:29.03 ID:glY3n63N.net] お前らの家の冷蔵庫にエルビス・プレスリーがいないからといって、この世にエルビス・プレスリーがいないことの証明にはならないんだよ 血を吐くまで探せ
824 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 15:55:06.91 ID:4r95dvH8.net] 不具合あるのを証明したほうがてっとりばやい
825 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 16:02:32.88 ID:glY3n63N.net] あぁ?わかって言ってんのか? 泥棒の証拠を泥棒に探させるのがアベガー品質だぞ
826 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 16:09:49.79 ID:Px+syONf.net] 元々>>637 がC++でもfgetsを使う俺は天才などとのたもうて >>687 がFILE*を使うなら例外安全をどう保証するのという話だったのが、 当の>>637 は>>691 でfread/fgets自体が例外を投げる可能性(?)という謎の問題を考え始め >>710 が根拠不明の2GB制限の話を持ち出し 問題があると考えるひとは存在しない2個の問題を同時に考えて混乱し まあまあ分かってる人はRAIIすればいいじゃん(ってかfstreamでいいじゃん)で話が終わっている まとめるとこんなところか?
827 名前:デフォルトの名無しさん [2021/10/20(水) 16:17:28.71 ID:glY3n63N.net] 挙証責任をガン無視できる文部科学省元事務次官前川喜平こそ最強 座右の銘は面従腹背、ライフワークは貧困調査
828 名前:デフォルトの名無しさん mailto:sage [2021/10/20(水) 16:39:46.06 ID:NMVwWGr0.net] キチガイ極左は内ゲバで共食いしとれ
829 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 00:40:30.45 ID:ObBh/r
] [ここ壊れてます]
830 名前:k9.net mailto: >>806 俺はcの標準ライブラリ使うならosの関数使えって言ってた人でアンカの中には登場しない人だけど 「根拠不明の2GB制限」についてはlarge file問題というのが昔あった https://en.wikipedia.org/wiki/Large-file_support LinuxなどUnix系が64bit環境にほぼ移行した現在その問題はレアケースだとは思うけど 32bitアプリが割と残っているWindowsだと実際のところどうなのか分からない でもfreadくらいは出来そうだと考えわざわざコード書いただけ(>>799 ) ちなみにLinuxでもdebian系のantiX 19.4 32bit環境では#define _FILE_OFFSET_BITS 64がないとfopenがNULLを返していた [] [ここ壊れてます]
831 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 00:51:53.61 ID:l0SlZ35R.net] 話の肝は「私が間違ってました。ごめんなさい」と素直に言えるかどうかなわけで 小室文書みたいな屁理屈の羅列はいらねンだわ
832 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 01:06:38.58 ID:5bux1k1I.net] >>807 NHK は メード イン ジャパン とか オーダー メード とか表記するのに メイド 喫茶は なぜ メイド 表記なのですか?
833 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 01:19:29.04 ID:ObBh/rk9.net] ちなみに>>809 の「cの標準ライブラリ使うならosの関数」という意味で以前実験した結果も貼っとく read, fread, std::ifstream::readの比較 https://ideone.com/H2jc7B systemdのユーザーごとのRAMディスクを使っているのでそれがある環境でだけ動作する ubuntu 20.04 64bit環境で実行した結果だと↓ $ g++ -O2 test.cpp -o test $ ./test 227 267 225 $
834 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 03:46:14.13 ID:Y6x8PTxQ.net] >>811 前者がmadeで後者がmaidだからじゃね?
835 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 07:45:14.90 ID:5PpYpVBN.net] 以前はメードだったと思うけどね
836 名前:デフォルトの名無しさん [2021/10/21(木) 11:19:37.65 ID:l0SlZ35R.net] ババ抜きはOld maidの日本語訳だよ セクシズムやエイジズムはポリコレの立場から見てどうだろうね
837 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 12:39:37.82 ID:u1ltZUWw.net] regexで\dを使いたい場合はどうやるん?
838 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 14:10:28.52 ID:ObBh/rk9.net] https://cpprefjp.github.io/reference/regex/basic_regex.html
839 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 17:33:55.95 ID:MfhbDLcG.net] >>812 その比較でなんで fread だけ遅いんだ?と思ってコード見たら fread じゃなくて fgets になってた。 あと read_cpp_standard() の if (std::cin.fail()) もたぶん f.fail() の間違い。
840 名前:デフォルトの名無しさん [2021/10/21(木) 18:24:19.20 ID:/1ln80gU.net] >>815 フェミが言葉狩りのネタにしないのは何故
841 名前:デフォルトの名無しさん mailto:sage [2021/10/21(木) 18:42:48.64 ID:7ERuyWg6.net] 言葉狩りなんてないから
842 名前:デフォルトの名無しさん [2021/10/21(木) 18:56:39.47 ID:ObBh/rk9.net] >>818 thx >>812 のコードは脳内破棄してくれ 指摘された部分を修正した https://ideone.com/DoI3ww 同環境での測定結果が↓ 214 213 214 freadだとバッファリングされるからその分遅いのかと勝手に思ってたらそんなところから間違ってたとはすまんw
843 名前:デフォルトの名無しさん [2021/10/22(金) 00:41:05.61 ID:bIdSm1HR.net] BB抜きが有ってGG抜きが無いのは差別
844 名前:デフォルトの名無しさん [2021/10/22(金) 00:43:55.21 ID:bIdSm1HR.net] >>821 fread最強でFA
845 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 01:17:58.50 ID:JLUkeFzw.net] freadのバイナリな DMA効くのは テキストはゴミ
846 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 02:55:23.69 ID:ugOmuUc2.net] >>822 ジジ抜きもあるよ。 ジジ抜きはジョーカーを使わない。 適当な札を一枚抜いておいて組にならない札を最後まで持ってた奴が負け。 どれが負け札なのか最後までわからないというのがゲームの面白い部分。 ちなみに日本語でジジ抜きと呼ばれているゲームこそが Old maid (行き遅れ、お局様) の本来のルールで、 ペア (結婚相手) がないことを Old maid に喩えた命名になっている。
847 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 05:43:15.83 ID:I4IH0MDY.net] C++20ちょっと書き始めたらvscodeのインテリセンスが何でもないところにエラーの波線出しまくってくる
848 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 07:07:31.23 ID:viI1I/mh.net] DMAか、懐かしい
849 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 12:50:15.03 ID:xpSH/+fs.net] >>826 どの環境でそうなる?
850 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 13:37:10.17 ID:I4IH0MDY.net] >>828 OS: Windows 8.1 (64 bit) コンパイラ: MinGW GCC 11.1.0 文句を言ってくる拡張機能は多分普通の"Microsoft C/C++ 拡張機能"でコードの例としては https://wandbox.org/permlink/Fcqjvfqt8rWVqren こんな感じ エラーは operator<=>: 戻り値の型だけで識別される関数はオーバーロードできません requires(1個目): こちらでは requires 句は許可されていません (テンプレート関数ではありません) vec: エイリアス テンプレート "vec" の引数リストがありません v: ';' が必要です という感じ まあエイリアスのやつはC++17でも言えるけど
851 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 23:23:13.68 ID:Q/4+pM2R.net] Pythonのリストのように不定型の配列を作るにはどうすればいいですか? vector<int> a; vector<double> b; vector<vector<any>> hoge; hoge.emplace_back(a); hoge.emplace_back(b); みたいなことをしたいですが、エラーになりました。 最終目的は、 void f(vector<vector<any>>, vector<vector<any>>) のような不定型配列を複数引数に取る関数を作りたいです。
852 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 23:45:34.05 ID:vgFDGRgE.net] std::variantつかうとか
853 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 01:05:44.90 ID:UQ/XjfNb.net] >>830 出来るといえば出来るんだが、動的型っぽいことを C++ でやろうとすると煩雑だよ。 std::any は何でも格納できるが使うときには結局は元の型として取りださないといけない。 格納することが出来たとして、その後にどういう風に使うのかによってデザインの仕方がかわってくる。
854 名前:ハノン mailto:sage [2021/10/23(土) 01:33:33.73 ID:0KDU0Kot.net] >>830 C++17以降、へえ、こんなこともできるんだ… https://cpprefjp.github.io/reference/variant/variant.html https://ideone.com/G8IPFR >>831 ありがとうございます!
855 名前:ハノン mailto:sage [2021/10/23(土) 01:34:50.09 ID:0KDU0Kot.net] >>832 うん、実用に供するまでには結構大変そう、使い道がわからん…
856 名前:はちみつ餃子 mailto:sage [2021/10/23(土) 01:57:47.58 ID:UQ/XjfNb.net] >>834 クラスの設計段階で抽象クラスとの継承関係を作っておくだとかいった方法で多相にするのが 旧来からの方法で、それができるならそのほうがまともなものになると思うんだが、 そうは言ってもユーザーからは弄れない既存のクラスをどうしても使いたいということも無くはない。 根本的な部分をいじれないときに場当たり的にどうにかするよりは std::any や std::variant を使ったら 少しはマシかもねという程度の話で、あまり積極的に使うようなものではないというのが私の感触だな。
857 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 08:10:22.62 ID:LycCK1PV.net] void*よりはちょっとマシって程度の感覚だな
858 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 10:04:52.59 ID:rMqegMI3.net] >>832 その後の使い方は、基本的には 全要素をany_castでstringにして使うつもりです。 不定型可変長のデータを受け取ってcsvファイル出力に使いたい感じです。
859 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 10:05:50.17 ID:bwy1yWHL.net] void*「むかしはあんなに愛してくれたのに…」
860 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 11:08:12.01 ID:FGy8rv7m.net] >>830 any使うんだったら、 vector<vector<any>> hoge; じゃなくて vector<any> hoge; じゃない?
861 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 11:40:12.00 ID:KcnUiVki.net] >>835 >>833 じゃないけど>>833 のdump()を例えば template<class... Args> void dump(const std::variant<Args...>& e) { std::visit([](const auto& x){ std::cout << " " << x << std::endl; }, e); } template<class V> void dump(const std::vector<V>& v) { for (const auto& e: v) { dump(e); } } みたいにするんなら class Dumpable { virtual void dump() = 0; }; みたいな抽象クラス作って素直にArgsの各classが継承(実装)した方がいいと思うってこと?
862 名前:はちみつ餃子 mailto:sage [2021/10/23(土) 13:07:50.50 ID:UQ/XjfNb.net] >>840 そう。 クラスごとに違う挙動が必要ならその違いはクラスの中に隠蔽されているべきで、 クラスを使う側で分岐するのはなんかちょっとあれだなという感じ。 型を調べて分岐するようなコードが嫌だから動的な型を調べる機能を意図的に入れなかった話は D&E にも書かれてる。 (最終的には typeid が導入されてしまったけど……) ただそれは「型を追加したくなったら分岐も増やすのはめんどいしミスしそう」みたいな話なので、 十分に賢いユーティリティが標準で用意されている今ならそれほど強い動機でもないんだけどね。
863 名前:デフォルトの名無しさん [2021/10/23(土) 13:12:23.67 ID:quaWTEll.net] C++はパラメトリック多相が無いからこういうのは面倒だよね。 とりあえずはstd::vector<std::function<std::string()>>に[v](){ return std::to_string(v); }; あたりを入れとくのが簡単かね。 conceptを「その制約を持つクラスの総称クラス」としてshared_ptrあたりで指定できるようになると便利なんだけどなぁ。 concept_shared_ptrとか用意してくれんかね。
864 名前:はちみつ餃子 mailto:sage [2021/10/23(土) 13:16:46.64 ID:UQ/XjfNb.net] >>837 any_cast での取り出しは「元の型」でなければならず、 string に変換可能な型であっても any_cast<string> は出来ない。 (やったら例外が飛ぶ) 最終的に文字列になると決めているなら文字列にしてから格納したほうがすっきりするんじゃないの。
865 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 14:23:02.68 ID:KcnUiVki.net] >>841 まあそうだよね。ありがとう。
866 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:17:03.78 ID:mo2+vXTQ.net] >>771-772 以下のような場合についてBarクラスがRAIIであるというだけでどう例外安全にできるのかお考えをお聞かせ願えますか void foo() { { // 何かのコードブロック (try { } catch { } のtry{ } とかでも良い Bar x, y, z; (例外を生じる可能性があるコード) アプリケーション固有の別スレッドXにイベントなりシグナルを送る } } >>723 上に書いたようなケースを踏まえてっ例外安全に言及している>>720 と>>721 に対して 理解しいないまま捨て台詞を残して逃走した>>722 とか、
867 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:20:03.55 ID:mo2+vXTQ.net] >>772 コードブロック内のreturnがあるかもしれないんならチェックすれば良いやん? >>763 は普通の人ならチェックするでしょ、という主張 ところが>>722 のような例外安全主義者ときては、RAII = 例外安全、で脳がショートしているのや 多分周りも能力に忖度して大した課題を与えていないんだと思う
868 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:40:20.31 ID:i4dOTOfz.net] 上では例外安全にするとかしないとか言っていたような気がしたが少し主張が変わったのかな。 - 例外安全を求めるのは当然 - RAIIを使えば比較的例外安全を保証しやすい - だからといってRAIIを使えば自動的に例外安全になるわけではない 結論としてはこんな感じだと思うが。
869 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:41:27.07 ID:7jz7Y9vl.net] チェックして例外出さないと解放されないコード書いたのか…
870 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 09:13:23.68 ID:1SVJ9Wvp.net] そりゃ例外安全もRAIIも魔法じゃないんだから使えば即安全になるというわけじゃないわな 「ちゃんと使えば」をすっ飛ばして>>845 みたいなことを言い出すのも一種の思考停止だろうと思うわ
871 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 09:51:02.52 ID:v4numFpL.net] >>845 Barのデストラクタの責務は自分が確保したリソースをリークしないことだけだ オブジェクトの外側でやってるスレッド間通信のことなんかBarは知らんし別に手当するだけの話 逆に聞くがRAIIを嫌がってBar* x = new Bar;とかにしたらなんか事態改善すんの?スレッド間通信を簡潔に書くための役に立つの?
872 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:24:44.80 ID:P2kmr3bK.net] そもそもRAIIが例外安全のためっていうイメージ全くないんだけど リソースのお片付け(≒メモリリーク防止)が主目的ちゃうん?
873 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:36:38.75 ID:i4dOTOfz.net] 例外が発生するとリソースを片付け損ねる場合があるってのが例外安全を欠く一番よくあるケースだと思うけど。 主目的がどうとかは別として。
874 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:45:51.44 ID:NLtlOSxj.net] >>845 例外を生じた場合でもXとなんらかの通信を行うべきなら thread_connectionみたいなクラスを作ってデストラクタに整合性を保つためコードを書くのがいいかな 「アプリケーション固有の〜を送る」の部分にはそのオブジェクトのメソッド呼び出しにしておく 例外発生時にはデストラクタによってXスレッドに異常を通知してXスレッドが持つ状態の整合性を確保してもらう Xに通知するのが単なる終了通知なら(成否を区別して処理しなくていいなら)全部デストラクタでいいかもね
875 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:47:45.55 ID:KyFc3YJo.net] 結局コードがないのでまた空中戦になってますね
876 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 11:38:44.49 ID:IQSwOnqn.net] 例外でデストラクタ呼ばないケースなんてあるんですか? プログラム自体が止まるのは別として
877 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 12:07:45.68 ID:KyFc3YJo.net] リマインダー>>731
878 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 14:38:53.43 ID:KyFc3YJo.net] これg++ 9.3だとstd::endlがなぜかconst variant<>と思われてエラーになってるみたいなんだけど、なぜ? #include <variant> #include <iostream> using namespace std; template<class C, class... Args> C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl; return 0; } https://godbolt.org/z/dbodW3xfG
879 名前:ハノン mailto:sage [2021/10/24(日) 15:13:35.43 ID:rOnHPdOM.net] >>838 「「最初から void * な実体」は作らない」「void (*)(void *, ...) くらいまでがせいぜいだ」というように努めていた私は愛し方が足りなかったのでしょうか? 最近の愛し方:https://mevius.5ch.net/test/read.cgi/tech/1624028577/305
880 名前:はちみつ餃子 mailto:sage [2021/10/24(日) 18:37:46.86 ID:SzIAMYLD.net] >>857 std::endl は関数テンプレートなので型と比較しようとするとインスタンス化に失敗するというエラーだと思う。 (std::endl を普通に使うときは左辺の型を利用して推論される。) 型を明示して渡せば variant との比較に失敗して通常の改行として解釈してくれる。 #include <variant> #include <iostream> using namespace std; template<class C, class... Args> C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << static_cast<std::ostream&(*)(std::ostream&)>(std::endl); return 0; }
881 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 19:35:48.44 ID:KyFc3YJo.net] >>859 う〜ん、よく分かりませんね。確かに勝手にendlは[with _CharT = char; _Traits = std::char_traits<char>]なbasic_ostreamを 引数にとって返すと想定しちゃってましたが、その時点でインスタンス化しようとしてエラー出す理由が分からない・・・ 例えばテンプレート引数を直指定しても #include <variant> #include <iostream> using namespace std; template<class C, class... Args> C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl<char>; // ここが違う return 0; } 同様にエラーのままでした。castしたときだけなぜ判定失敗してくれるのかもう少し考えてみます。 ありがとうございました。
882 名前:はちみつ餃子 mailto:sage [2021/10/25(月) 00:43:36.43 ID:dRHq7DJG.net] >>860 左辺が曖昧だからかもしれない。 左辺の型を std::ostream で固定すれば通る。 #include <variant> #include <iostream> using namespace std; template<class C, class... Args> std::ostream& operator<<(std::ostream& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl<char>; return 0; } でもこのとき型変数 C は不要だなと思って class C を削るとエラーになるんだよな。 なんだかよくわかんないね。
883 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 02:18:03.94 ID:LmZJdmU+.net] >>861 度々ありがとうございます。再現確認したところ、確かに余計なテンプレート引数が1つあるだけでこのエラーが出ないみたいですね。 試しに元のコード(>>857 )に余計なパラメータを1つ入れるだけでも通りました。 #include <variant> #include <iostream> using namespace std; template<class T, class C, class... Args> // ダミーパラメータT追加 C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl; return 0; } ほんとによく分かりませんね。 castの件は第2引数のvがテンプレート関数でなければ弾けるということのような気がします。 https://onlinegdb.com/ol3BYChIx
884 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 02:19:56.83 ID:LmZJdmU+.net] 最後のコードは右上の設定ボタンから -std=c++17 を追加することで実行できます。
885 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 13:57:01.70 ID:p1HT8A4i.net] iostreamのシフト演算子オーバーロードは文句を言われてるがrangesのoperator|のオーバーロードはどうなんですかね
886 名前:はちみつ餃子 mailto:sage [2021/10/25(月) 14:01:06.87 ID:dRHq7DJG.net] 感覚的にはまあ順当だろうと思う。 日付やパスで / を使うのに比べればよっぽど……。
887 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 15:38:37.13 ID:x4U5y7kU.net] 組み込みの意味を持たないオーバーロード専用演算子があれば良かったのにな 用意しておかなかったのはC++の初期デザインの失敗だったと思う
888 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 16:09:42.75 ID:SLeimCOK.net] 意味を持たない演算子が意図せず呼ばれてしまうくらいならコンパイルエラーになったほうがマシでは
889 名前:はちみつ餃子 mailto:sage [2021/10/25(月) 17:28:55.78 ID:dRHq7DJG.net] ところで Haskell で一定の記号の組み合わせは何でも新しい演算子として定義できる仕組みがある。 !#$%&*+./<=>? あたりとその他 Unicode 内いくらかも含めた組み合わせで演算子を作っていい。 優先順位も決められるし左結合か右結合かも決められる。 事実上無制限に違う字面の演算子を作れるんだよ。 <?+> とか #-. とか <<-~ みたいな演算子が実際に使われてるわけ。 こういう極端なのはさすがにあまりうらやましくはないよな……。 >>866 かといって有限の演算子をある程度に多く用意したところで
890 名前:オーバーロードを許すなら どこかで全然違う意味で使われることもあるのは避けようがないし、 C++ くらいにスッパリと諦めるのもそれはそれで思い切りが良くて良いと思う。 [] [ここ壊れてます]
891 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 17:51:03.08 ID:s1VnbLSn.net] 演算子ってのはwellknownだからこそ意味があると思うんだけどな 演算子のオーバーロードもその“意味”から大きく逸脱しないことを求めていたと思うし 意味を持たないオーバーロード専用演算子ってのは プログラマーによって意味が真逆になりかねないから危険だと思う そんなことするぐらいなら普通に名前を付けて関数定義したほうがマシに思える
892 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 17:56:20.95 ID:5fKOgArh.net] そこら中訳わかんない記号だらけのソースとか悪夢でしかないなw
893 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 18:04:59.44 ID:LmZJdmU+.net] >>857 の原因判明しました。 同一の問題がstackoverflowで解決されていたのでリンクだけ貼っておきます。 https://stackoverflow.com/questions/52845621/cant-stream-stdendl-with-overloaded-operator-for-stdvariant 上記に従った対策コードは以下のとおりです。 https://godbolt.org/z/8e9o3MnaG
894 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 20:01:58.87 ID:VZsrHh6g.net] >>866 リザーブの演算子持っとけって言いたいんだろうけどこう言う奴はいくつ持ってても足りねーとか言うからw
895 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 21:34:55.28 ID:3IW01+t9.net] 演算子オーバーロードって自分で書くにはいいけど他人のコードを読むのが地獄だな。
896 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 21:35:04.23 ID:EqTxifVC.net] while (fread(&x, sizeof(double), 1, fin) > 0) { fprintf(fout, "%5.4f\n", x); } こんな風に書くとコベリティ君がfreadは読み込んだバイト数を返すが使っていませんみたいなこと言い出すんだが は?使ってますけど?みたいな気持ちしかないんだけど 何を求められてるんだろうか。
897 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 06:12:19.30 ID:lDQyydUS.net] >>874 そんなのシノプシスに聞けよ…
898 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 06:48:54.44 ID:ch+2e+/f.net] >>870 昔のAPLとかかw
899 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:08:42.05 ID:a/qQal0X.net] 演算子に限らず、ある関数を特定の名前空間の内部だけ使えるように限定できたっけ? 「あるスコープだけこういう使い方」ならまだ混乱も少ないかね。
900 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:14:06.41 ID:FOkaXEb/.net] ん? それこそが名前空間の可視性制御だろ
901 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:14:48.16 ID:X4knYEql.net] 関数内で構造体を定義し、その中でstatic関数を定義する
902 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:15:27.77 ID:X4knYEql.net] あ、違った class内のprivate関数でいいんじゃね
903 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:27:02.14 ID:cqUp+YH+.net] >>878 名前空間の外にお漏らししないようにできたっけ? 同じ名前空間にクラス定義しなければADLも気にしないでいいのかしらん。
904 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 09:22:33.47 ID:tIXOLnPL.net] >>881 この手の話? cpp.aquariuscode.com/adl-firewall
905 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 10:05:37.17 ID:I5hwU/3x.net] >>874 fprintfはええんか?
906 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 10:21:21.31 ID:g/XkL0k7.net] niebloidの出番じゃないの?演算子オーバーロードには使えないが
907 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 12:31:52.75 ID:E+rw0Wy/.net] >>882 そうそう、そんな感じ。 実際には演算子を閉じ込めたい名前空間の中でクラスを定義しなければADLは影響しないけど、もし定義するとしてもこの技法で回避できそうだね。
908 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 12:54:35.40 ID:FaeDWsHu.net] 今日もまた単発IDの曖昧発言onlyですね
909 名前:ハノン mailto:sage [2021/10/31(日) 10:43:09.43 ID:hT9enBIH.net] テステス
910 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:04:38.20 ID:uZUsIwlp.net] std::function を引数にとる関数を作ってるんだが、参照で渡すのとコピーで渡すのでどのように動作が変わるかわからない 参照で渡して良いですか
911 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:28:34.89 ID:2TKPTRzu.net] std::funcて中身は関数ポインタ―でしょ コピーで済むものを参照で渡す必要はそもそもないんじゃないの 受け取り先で書き換えて返すなら別だけど
912 名前:はちみつ餃子 mailto:sage [2021/11/01(月) 17:29:06.34 ID:w5vOXkrp.net] >>888 「引数にとる」というのは実引数の型も std::function 型という意味?
913 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:41:35.71 ID:ja4QDiEt.net] 保存目的なら値渡しのほうがよいらしい https://stackoverflow.com/questions/18365532/should-i-pass-an-stdfunction-by-const-reference
914 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:42:17.47 ID:P2kjdACs.net] コピーだろー
915 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:54:17.61 ID:uZUsIwlp.net] >>890 関数を想定しています
916 名前:はちみつ餃子 mailto:sage [2021/11/01(月) 17:58:12.22 ID:w5vOXkrp.net] >>893 仮引数の側を std::function の参照にしたところで、実引数の側が std::function ではないときは 変換して一時オブジェクトを作ってからその参照をとる形になるんだよ。 これは std::function に限らない一般原則。 どちらにしても新しいオブジェクトを構築するので参照にする意味がない。
917 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 18:35:36.43 ID:XqzqlHR8.net] クラスのメンバーにstd::functionをいくつか用意しておいて、 条件によりどれかのstd::functionを引数に取るprivateなメンバ関数とかなら参照にする意味はあるかもしれないw
918 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 19:28:38.40 ID:Qg2QcgLf.net] この流れで質問をば。 std::functionだと単体のR opetator()(Arg...)しか指定できないけど、複数のメソッドを指定できるように拡張するにはどうしたらいいかしらん? 継承じゃなくてtype erasure を使ったgeneral smart pointerとでもいうようなやつが欲しいんだけど、どこかに実装ないかなぁ。
919 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 19:49:46.26 ID:Iw+wFADq.net] anyの使いどころ?
920 名前:896 mailto:sage [2021/11/01(月) 20:35:42.39 ID:0sJcc+2w.net] anyだとメソッドを呼び出せないから機能が足りないですな。 メソッド呼び出しできるインターフェイス付きanyみたいな感じ。 用途は「指定したメソッドがあれば継承関係無しでブチ込める親クラスみたいなanyみたいなshared_ptr」だけど。
921 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 20:39:54.69 ID:ja4QDiEt.net] 理解できてないけど普通のテンプレート引数を持つ関数じゃいかんの?
922 名前:896 mailto:sage [2021/11/01(月) 21:35:17.71 ID:0sJcc+2w.net] Haskellの型タイプというのがイメージに近いか。 具体例をだしてみると、 class A { public: string test1() { return string("A1"); }; string test2() { return string("A2"); }; }; class B { public: string test1() { return string("B1"); }; string test2() { return string("B2"); }; }; vector<generic_ptr<string test()>>c; c.push_back(make_shared<A>()); c.push_back(make_shared<B>()); c[0]->test1(); // A1 c[1]->test1(); // B1 c[0]->test2(); // A2 c[1]->test2(); // B2 みたいに、anyみたいに雑多なオブジェクトをブチ込むけど、 anyとは違ってそのまま共通メソッドを呼び出せるようにする、 というのが狙いね。
923 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 22:33:44.83 ID:JtJuMIHt.net] >>900 https://www.google.com/search?q=Boost.TypeErasure
924 名前:896 mailto:sage [2021/11/02(火) 00:28:12.27 ID:F29rpsLU.net] >901 ありがとう。こういうのもあるのね ……でも BOOST_TYPE_ERASURE_MEMBER を使ったコンセプトがWandboxで上手く動かないなぁ。 もうちょっと試してみるか。
925 名前:デフォルトの名無しさん mailto:sega [2021/11/02(火) 10:51:55.89 ID:7a5iqwfV.net] std::thread で作られるスレッドって スタックサイズはデフォルトいくつなん? 変更とかできるん?
926 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 10:59:21.25 ID:oKrr57AH.net] >>903 スタックなんて概念がないのに制御できるわけがない
927 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 11:48:47.80 ID:LR6fq+wY.net] linuxならulimit -sかpthread_attr_setstacksizeで設定できる ただ確保されるのは仮想メモリなので現実的にはその設定あんまり使い所がない そしてC++とか関係ない
928 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 13:09:21.89 ID:TehqQXLJ.net] stdよりposixのほうが洗練されてるよな
929 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 17:28:47.39 ID:LR6fq+wY.net] 何いってんの?この人
930 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 19:04:22.54 ID:TehqQXLJ.net] 意味わかんなくてpthread使ってんなら相当頭悪い
931 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 19:13:49.36 ID:U4IKz2Wy.net] むだに喧嘩すんなよ
932 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 19:28:12.57 ID:LR6fq+wY.net] 比較対象がおかしいんだからしょうがなくね?w
933 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 00:18:59.36 ID:2vTbLoUN.net] 基底クラスに定数持たせるけど値は継承先で決めたい。 例)Carクラスには計算に使うが変更はしない定数 weight hight width があり、それは継承した車種クラス毎に異なる、など。 下記でコンパイル通るようですが、定数増えると見づらく、もっとスマートなやり方あったらご教授願いたく。 class Car { protected: const double weight, height, width; public: Car(double w, double h, double wd) : weight(w) , height(h) , width(wd) {} }; class CarA : public Car { CarA() : Car(1000.0, 1.8, 1,8) {} };
934 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 00:22:58.93 ID:O1PLiy99.net] 別に普通だと思うけどどの辺が見づらいと思うんだ?
935 名前:はちみつ餃子 mailto:sage [2021/11/05(金) 01:26:19.60 ID:8QrXrM3i.net] 値が const であるだけでなく static であって欲しいという意図なんじゃないかと想像する。
936 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 01:29:07.53 ID:zGuhJhpK.net] クラステンプレート化すればいいじゃない template<double W, double H, double WD>
937 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 01:41:20.30 ID:gd3zcTPm.net] doubleってテンプレート引数OKになったの?
938 名前:はちみつ餃子 mailto:sage [2021/11/05(金) 01:48:57.72 ID:8QrXrM3i.net] >>915 C++20 で非型テンプレート引数の大幅な緩和があった。
939 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 02:25:46.30 ID:Xs8oV2Az.net] C++20では普通に使えるかもだけど、引数に名前を付ける風のトリックがあるらしい https://www.fluentcpp.com/2018/12/14/named-arguments-cpp/
940 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 05:55:16.82 ID:caWVwyr0.net] >>911 virtual double weight() const = 0; じゃあかんの?
941 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 06:25:31.61 ID:8h2e+y9J.net] >>912 引数が数値ばかりで10個とかあると確かに何を指定してるのかぱっと見わかんなくなりそう C++なら>>918 に一票だけど参照する時に ( ) が要るからこう言うケースだとC#のプロパティが欲しくなる
942 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 07:38:38.22 ID:gd3zcTPm.net] C++20で指示付き初期化が出来るようなので、もしC++20が使えるなら定数を構造体にまとめたらいいかも https://cpprefjp.github.io/lang/cpp20/designated_initialization.html
943 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 08:22:45.14 ID:OHT8JXtH.net] >>911 Builderパターンとか? 面倒だったらDirectorクラスは省略しても問題なさそう。 類型的な車種ごとにBuilderを派生させてデフォルト値を決めといてもいいかと。
944 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 12:38:49.71 ID:gSSLx8YQ.net] >>919 参照するときに()ていうのは a=car.weight(); ていうこと? a=car.weight; と表記したいならoperator=をオーバーロードすればいいかと
945 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 13:46
] [ここ壊れてます]
946 名前::37.13 ID:Xs8oV2Az.net mailto: >>920 C++20で使えるのそれそれ。gccでは元々使えるけど... [] [ここ壊れてます]
947 名前:はちみつ餃子 mailto:sage [2021/11/05(金) 13:57:04.43 ID:8QrXrM3i.net] >>923 C (C99 以降) には有るからついでに C++ でも使えるようにするのは gcc 的にはたいした手間でもなかったんだろうと思う。
948 名前:はちみつ餃子 mailto:sage [2021/11/05(金) 14:01:00.76 ID:8QrXrM3i.net] ところで C の designated initializer では配列要素を指示することも出来るんだけど、 C++20 にはこれは入らなかったんだね。 ↓ こういうの。 const char *foo[5] = { [2]="bar" };
949 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 14:04:47.27 ID:XqgFcDRs.net] c++17以前でも引数を構造体にまとめれば{}で区切って記述できるようになるから多少マシにはなるよね IntelliSenseが効きにくくなるのが欠点だけど
950 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 14:10:59.42 ID:TiWO+rcp.net] >>922 君は何を言っているんだい?
951 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 14:27:51.72 ID:7LuUsMxr.net] そのCの記述素晴らしいよね C++的でないのはわかるがどうせ初期化時でしか使わんのだしとっとと入れるべきだった
952 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 16:10:31.37 ID:gd3zcTPm.net] >>925 ラムダ式のキャプチャと競合するためと書いてるね
953 名前:デフォルトの名無しさん mailto:sage [2021/11/07(日) 16:47:32.00 ID:qipzvPRM.net] https://ideone.com/d05dJ9 #include <iostream> #include <vector> #include <memory> using namespace std; #define MAX_SIZE 100 template <class T> // template <class T, size_t C=MAX_SIZE> class SizeLimitedAllocator { public: typedef T value_type; using traits = allocator_traits<allocator<T>>; T *allocate(size_t n) { if (n > MAX_SIZE) throw bad_alloc(); // if (n > C) throw bad_alloc(); return traits::allocate(_allocator, n); } void deallocate(T *p, size_t n) { traits::deallocate(_allocator, p, n); } private: allocator<T> _allocator; }; int main() { vector<char,SizeLimitedAllocator<char>> vec(MAX_SIZE); try { vec.resize(MAX_SIZE+1); } catch (bad_alloc& e) { cerr << e.what() << endl; } return 0; } このコードをコメント側に変更してコンパイルするとこけるんだけど、なんで?
954 名前:デフォルトの名無しさん mailto:sage [2021/11/07(日) 17:51:19.26 ID:ISiN+sDp.net] >>928 aggregate限定だね
955 名前:デフォルトの名無しさん mailto:sage [2021/11/07(日) 17:56:01.13 ID:Mdbpk+F7.net] >>930 https://en.cppreference.com/w/cpp/named_req/Allocator#cite_note-2 > rebind is only optional (provided by std::allocator_traits) if this allocator is a template of the form SomeAllocator<T, Args>, where Args is zero or more additional template type parameters. これですかね? カスタムアロケータ自分で定義したことないのでじゃあどうすればいいかは分かりませんが……
956 名前:デフォルトの名無しさん mailto:sage [2021/11/07(日) 18:53:11.25 ID:Qwz9shRh.net] rebind_allocが悪さしてたりして
957 名前:デフォルトの名無しさん mailto:sage [2021/11/07(日) 19:23:12.01 ID:A2QjBZsT.net] >>930 SizeLimitedAllocatorの定義にこれ追加すればいいよ template<typename U> struct rebind {using other = SizeLimitedAllocator<U,C>;};
958 名前:デフォルトの名無しさん mailto:sage [2021/11/08(月) 00:05:22.17 ID:dWDs4ee0.net] https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/ptr_traits.h#L62-L69 この辺の定義にある 定数値という型でないものがテンプレート引数に入ったため、__replace_first_argの下側の定義が使われず 上側の定義が使用されtypeも入らず https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/alloc_traits.h#L80 でrebindできなくなったことが原因でした。 これを回避するためには、>>934 のように
959 名前: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/alloc_traits.h#L51-L57 この下の定義に当てはまるrebind<U>::otherを定義しておく必要があるようです。 定数値でなく型がテンプレート引数に追加された場合は、otherの定義は必要ありませんでした。 [] [ここ壊れてます]
960 名前:デフォルトの名無しさん mailto:sage [2021/11/10(水) 17:04:45.91 ID:9a0GsOuO.net] グーグルテストのASSERTの片辺に期待値をマジックナンバーじゃなくマクロ定数で指定すると赤線引いて来やがるんだけどVSだけ? ビルドは通るしテストもできるから全く問題ないんだけどうぜー
961 名前:デフォルトの名無しさん mailto:sage [2021/11/10(水) 20:17:21.11 ID:MFJzciMu.net] warningの種類ごとにon/offしたくなる
962 名前:デフォルトの名無しさん mailto:sage [2021/11/11(木) 00:05:50.61 ID:QjSth2/F.net] 大体のコンパイラはそういう#pragma持ってるだろ MSVCなら#pragma warning GCCなら#pragma GCC diagnostic
963 名前:デフォルトの名無しさん mailto:sega [2021/11/12(金) 12:50:12.26 ID:DicJ24/v.net] 改行コードとかタブコードとかが含まれた文字列を \nとか\tとかにエスケープしてくれる関数ってある?
964 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 12:53:25.82 ID:/M/iq88E.net] 速度気にしないなら正規表現で
965 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 13:28:00.04 ID:INEjO2I3.net] quote?
966 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 14:16:51.83 ID:IjXGHyKg.net] std::replaceは? sjisだとまずいかも
967 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 20:51:39.15 ID:4Xte/kSq.net] 文字コード周りはカオスすぎて標準も手に負えず匙投げたからライブラリ使った方がいいよ
968 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 23:22:09.10 ID:qmhW9zZv.net] >>939 C/C++の場合、1文字単位での文字列処理が得意なので、自作するのも簡単。 0x09 や 0x0a は、SJISやUtf8などの多バイト文字の中には含まれて無いから、 なおさら。 例えば、std::stringでも、新しい文字列変数dstを作って、srcの文字列 から1バイト単位で読み取って、dstに1文字ずつ末尾追加していけばいい。
969 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 23:28:15.13 ID:qmhW9zZv.net] >>944 [具体例] MFCのCStringなら、以下のようにするだけでよい: CString src = "元の文字列"; CString dst; // 変換後の文字列を入れる変数。 const char *ptr = (const char *)src; // CString の 0 終端文字列の先頭アドレスを取得するための変換関数を呼び出している。 while ( *ptr != 0 ) { if ( *ptr == 0x0a ) { dst += "\\n"; } else if ( *ptr == 0x09 ) { dst += "\\t"; } else { dst += *ptr; } ptr++; }
970 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 23:33:56.40 ID:qmhW9zZv.net] >>945 [補足] このプログラムは、1バイトずつ読み取っているが、文字符合は、このままでも、 無修正で ASCIIだけでなく、SJISやUTF8やEUCにも対応している。 後者のような符合では、例えば、SJISの"あ"の文字だと、1文字単位ではなく、 1バイトずつ処理され、2回ループが回るが、問題ない。 UTF8だと3回ループされる。 つまり、このプログラムでは、SJISの1文字は、2文字のように UTF8の"あ"の文字は、3文字のように処理される。 しかし、それでも結果的には問題ない。 なぜなら、0x0aや0x09は、多バイト文字の中には含まれてないから。 ただし、SJISの場合、\ の文字コードが含まれているので注意が必要ではあるが、 今回は問題ない。
971 名前:デフォルトの名無しさん mailto:sage [2021/11/12(金) 23:39:04.51 ID:qmhW9zZv.net] >>946 [補足2] char は、C言語が登場した時には、「文字」の意味であったが、 今は少なくとも C言語では文字の意味はほぼなく、1バイト(8BIT)の意味である。 そして、C言語でcharが1バイト(8BIT)で無い処理系は、主流ではないので無視 してよい。 Javaなどでは、charが 必ず16BITであるのとは対照的である。 ただし、Javaもサロゲートペアの文字に対しては、charは文字の一部であって 本当の1文字には対応していない。 ※結局、どの言語も、1文字を固定長で扱い続けることは避けている。
972 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 02:30:33.64 ID:sxA0duhG.net] メモリ確保が多発しそうなプログラムやね
973 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 06:30:48.47 ID:x1CN7sQN.net] 老害が一生懸命考えたんだろw メモリリークしまくられるよりマシ
974 名前:デフォルトの名無しさん [2021/11/13(土) 07:45:14.90 ID:xg91cK1y.net] CStringにせよbasic_stringにせよメモリ確保の多発なんて心配しなくていいよ JavaのStringじゃないんだから
975 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 08:44:09.90 ID:sxA0duhG.net] こういう時reserveしてなくても問題ないの? 最大容量わかってるやん。
976 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 09:34:35.76 ID:GqP7nzeW.net] メモリ2倍取るのと再配置とどっちが無駄かはそれこそ環境と目的次第だろ
977 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 11:06:02.43 ID:wYZH/w0f.net] >>945 CStringA もしくは _T("\\t")他
978 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 11:44:37.82 ID:wZp5djKL.net] vectorもそうだけど、倍々にメモリを再配置していくアルゴリズムがそこそこ効率的なので、 たいていの場合はreserveしようがしまいが有意な差は出ないよね
979 名前:デフォルトの名無しさん [2021/11/13(土) 12:34:40.00 ID:GR8tTV2x.net] >>943 ほんそれ std::codecvt_utf8_utf16とか黒歴史でしかない
980 名前:デフォルトの名無しさん [2021/11/13(土) 12:36:34.59 ID:GR8tTV2x.net] >>944-945 良い子は真似をしないように
981 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 12:49:12.18 ID:jQtDYU1M.net] プログラミングとしてはiso2020使ってた頃と大して変わらんよね 低レベルで吸収してくれんとやってられん
982 名前:デフォルトの名無しさん [2021/11/13(土) 13:24:23.81 ID:xg91cK1y.net] ファイル読み取りもシステムコール側が独自にバッファリングしていることが多いから プログラマ側ががんばってバッファリングしても二度手間だったりする
983 名前:ハノン mailto:sage [2021/11/13(土) 15:53:45.28 ID:DyUYxUU0.net] >>955 utf32<->utf8 utf32<->utf16 で十分だと思っていますが というか、 utf16 自体が黒歴史…
984 名前:ハノン mailto:sage [2021/11/13(土) 15:54:13.83 ID:DyUYxUU0.net] >>958 stdio.h をディするのはそこまでだ
985 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 17:16:26.07 ID:kpA91CRo.net] 文字コードなんて事実上iconvが標準だろ せいぜいicuくらい 他は一部のプラットフォーム固有の関数くらい 制御コードはISO2022でもなければ使わんし、いうてwhite spaceの類は使われてないから気にすんな 真面目にやると文字の境界見つけんのがだるいし、合成文字の扱いも微妙、異常系の仕様も要件次第になるし、Unicodeのバージョンも無限に上がりそうだけどなw ってわけでC++とか関係ない話だからどうでもいいよ
986 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 18:02:09.89 ID:vJfZgOKN.net] C++ なら strstream やろ
987 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 18:03:36.59 ID:vJfZgOKN.net] >>959 utf32<->utf8 utf32<->utf16 どちらも std:: のは黒歴史
988 名前:ハノン mailto:sage [2021/11/13(土) 18:39:04.73 ID:DyUYxUU0.net] >>963 そうなんですか… なぜなんですか?
989 名前:デフォルトの名無しさん mailto:sage [2021/11/13(土) 19:29:59.64 ID:vJfZgOKN.net] >>964 知ってるくせに https://cpprefjp.github.io/reference/codecvt.html https://cpprefjp.github.io/reference/codecvt/codecvt_utf8.html https://cpprefjp.github.io/reference/codecvt/codecvt_mode.html https://cpprefjp.github.io/reference/locale/wstring_convert.html
990 名前:デフォルトの名無しさん [2021/11/13(土) 21:14:20.03 ID:aIrFEHKz.net] 自分はHTML5の仕様に従って変換してます!
991 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 08:24:14.02 ID:gLhea8X6.net] >>959 結合文字列があるから、結局コードポイントに必ず1文字が対応しているとは限らないし、 何使ってもUnicodeは闇じゃないか。 まあ、UTF32使えばコードポイントがぶっ壊れることは避けられるけれども。
992 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 09:14:46.42 ID:ybz8bu8o.net] この場合同じコードポイントでの変換なわけだし一文字がどうとか関係ないが。
993 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 10:38:12.94 ID:G9ajtZXw.net] >>948 Perl/Ruby/JSなんかで正規表現を使って置換する場合でも、 同じようなアルゴリズムを使ってるはずだから、これが 特に非効率なわけではないし、代わりになるアルゴリズムで これよりトータルで効率の良いものも恐らく存在しない。 1.例えば、0x0aと0x09の出現回数を最初に数えれば、必要な dstのバイト数を見積もることは可能だが、その場合は、 二回もパースが必要になるし、プログラムも分かりにくくなる。 二回パースすることによる速度低下も有る。 2.dstのサイズはsrcのサイズの2倍を越えないので、単純に dstの内部バッファをsrcのバイト数の2倍として予約しておけば メモリ確保は一回で済むが、srcが巨大な時、メモリを圧迫し、 余り良いアルゴリズムとは言えない。
994 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 10:52:13.79 ID:G9ajtZXw.net] >>951 文字列のバッファは、不足すると2倍、2倍、・・・で確保されていくので 確保される回数は、最終的な文字列のバイト数を N としたとき、大体、 log2(N) 回程度となり、バッファがコピーされるトータルのバイト数は、 b = a + a*2 + a*2^2 + a* 2^3 + ... + a* 2^k k = log2(N) 程度 a = 文字列クラスの内部バッファの初期バイト数。 となり、大体で言えば、2N を越えない。 1 + 2 + 2^2 + 2^3 + ... + 2^k は 2進数で考えれば、全てのビットが 1 に成っている整数で、 2^{k+1} = 2*2^k = 2*2^{log2(N)} = 2 * N であることに注意する。 ただし、bの値は大体で書いたので、厳密には少し違うだろう。
995 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 10:59:39.62 ID:G9ajtZXw.net] >>970 1 + 2 + 2^2 + 2^3 + ... + 2^k = Σ_{i=0}^k 2^i = (1 - 2^{k+1}) / (1 - 2) = 2^{k+1} - 1 である。途中、等比数列の和の公式: 等比数列の和 = 初項 * ( 1 - 公比^項数) - ( 1 - 公比 ) を用いた。
996 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 11:04:20.53 ID:G9ajtZXw.net] >>971 誤: 等比数列の和 = 初項 * ( 1 - 公比^項数) - ( 1 - 公比 ) 正: 等比数列の和 = 初項 * ( 1 - 公比^項数) / ( 1 - 公比 )
997 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 12:08:34.21 ID:p964tW2k.net] 俺は数年前業を煮やして自前のstringクラスを作ってしまった(´・ω・`) ・sjis/utf8/utf16/utf32対応で比較・代入などどの組み合わせでも問題なく動く ・どの文字コードでも同じハッシュ値を生成する ・char型がsjisなのかutf8なのかはdefineで決める ・テンプレートベースのformatを用意してprintfを置き換え みたいな
998 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 12:57:01.80 ID:hL5WeBkj.net] >>973 保持するときのエンコードは?
999 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 12:58:38.01 ID:p964tW2k.net] >>974 文字コードの種類に1バイト用意して、後はそれぞれの文字コードで直接保存している
1000 名前:デフォルトの名無しさん [2021/11/14(日) 13:30:12.63 ID:mwYTHPjW.net] えー コンストラクタで各種文字コードのバイト列を受け取れるようにして内部保持形式はUTF32でよくない?
1001 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 13:42:53.43 ID:p964tW2k.net] それだと大きめのテキストファイルを開いたときなどいちいち変換が入って遅くなりそうだから…といっても実際にはどっちが効率良いのかまでは比べてないけど 異なる文字コード同士比較する時なんかはコードポイント単位で読み出して結局utf32ベースで処理するしな…
1002 名前:デフォルトの名無しさん [2021/11/14(日) 13:44:30.36 ID:E00roTgy.net] >dstのサイズはsrcのサイズの2倍を越えない しね
1003 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 13:59:19.66 ID:5aeLrxCA.net] プログラマーは3種類しかいない 文字コードが分からない一般プログラマー 文字コードを理解したと勘違いしている地雷プログラマー そして人類が文字コードを理解するのは不可能だと悟った上でなんとか事故が起こらないように心を砕く真の専門家だ
1004 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 14:17:19.40 ID:p964tW2k.net] >>976 あーあとは、これのstring_viewバージョンがあって、関数のパラメータをconst mystring_view& strみたいに受けると、どんな対応してる文字なら(リテラルや対応してるクラス含めて)なんでも参照として受け付けるから便利なんだよね
1005 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 14:59:21.42 ID:WpZMPVn+.net] それconst&いるんか?
1006 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 15:13:11.67 ID:p964tW2k.net] 実質的にはほとんどなにも変わらないと思うけど、無駄なコピーが減る場合もあるので付けておくに越したことはないと思う
1007 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 15:45:24.64 ID:p964tW2k.net] まぁ、でも参照もコストゼロってわけじゃないから、場合によっては遅くなることもあるか…
1008 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 16:54:05.80 ID:tkHjD9h1.net] const って伝播するから嫌い 付けるのは反対ではないが
1009 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 17:26:15.73 ID:CXUBNW9m.net] 伝播ってどういうこと?
1010 名前:はちみつ餃子 mailto:sage [2021/11/14(日) 17:38:21.62 ID:A4GQ1/1N.net] 参照で受け取るときには const を付けないと右辺値を受け取れないんだよ。 && にしたら逆に右辺値しか受け取れないし、 テンプレートにするのも面倒くさいし、 const 参照で不都合がないならまずそれを選ぶのが常道になってる。 積極的にそうする必要はなくても手癖でやるよね。
1011 名前:はちみつ餃子 mailto:sage [2021/11/14(日) 17:44:17.95 ID:A4GQ1/1N.net] >>985 const 無しから const 付きの参照へは暗黙の型変換が許されるがその逆はない。 const 付きにしたらそれがずっと伝わっていくってことだ。 元のオブジェクトが const でないなら const_cast で const を剥がして書き換えるのは一応は有りなはずだが、 かなり行儀が悪いしな。
1012 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 17:59:13.06 ID:CXUBNW9m.net] スコープ限定のconstを欲するひとがいるとは思わんかった
1013 名前:デフォルトの名無しさん [2021/11/14(日) 18:02:00.71 ID:nLCz7RQY.net] 責任ベースのconstは有り得るのでは? privateが在るんだから。
1014 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 18:05:38.66 ID:leu9kbhs.net] というか伝播しなかったら困るのでは? お行儀悪くconst_castしない前提なら ある関数の引数がconstだったら、その関数が呼び出す関数もまたconstであるという保証は大切だろうし
1015 名前:デフォルトの名無しさん [2021/11/14(日) 18:45:07.42 ID:nLCz7RQY.net] もちろんそれは大切ですよ。 伝搬しなかったら意味ないし。
1016 名前:ハノン mailto:sage [2021/11/14(日) 19:45:46.13 ID:5CSGBVhH.net] K&R2 にも const はありますが全然使わなかったなあ…volatile 同様キワモノだとおもっていました(爆)
1017 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 22:33:34.47 ID:oUoND4t/.net] C++20からコルーチン入るけどコルーチンの返り値に関数内の変数の参照返すの問題になるかな? hoge& test(){ hoge tmp; for(int i=0;i<10;++i){ co_yield tmp; } } //返り値は実際はgeneratorとかになるかもしれない
1018 名前:デフォルトの名無しさん mailto:sage [2021/11/14(日) 22:35:39.21 ID:PetPaRNq.net] yeild使えるようになるのか
1019 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 01:03:02.10 ID:tPLK0GqY.net] viewは値渡しが基本だよ
1020 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 06:05:50.61 ID:Rt8JG1Np.net] 何かのリミッタが外れた感じだね 無差別にぶち込むようになった
1021 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 06:11:48.42 ID:Rt8JG1Np.net] 江添が逃げた理由も察しがつく
1022 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 15:55:33.66 ID:Ux5WoKB6.net] 更新してないよね
1023 名前:デフォルトの名無しさん mailto:hage [2021/11/15(月) 16:41:30.12 ID:i/3H6iLT.net] hage
1024 名前:デフォルトの名無しさん mailto:pow(10,3); [2021/11/15(月) 16:42:03.92 ID:i/3H6iLT.net] 10^3
1025 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 98日 5時間 44分 33秒
1026 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています