前スレ
C++相談室 part156
https://mevius.5ch.net/test/read.cgi/tech/1621389313/
C++相談室 part157
■ このスレッドは過去ログ倉庫に格納されています
2021/08/09(月) 10:57:31.60ID:JaaB5Egp
790デフォルトの名無しさん
2021/10/20(水) 13:30:01.90ID:OEiI06HQ fseek()/ftell()が32bit用でfseeki64()/ftelli64()の方を使ってないというオチか
791デフォルトの名無しさん
2021/10/20(水) 13:36:27.87ID:glY3n63N 自信をもって断言したところで、モリカケ・桜を見る会と同じことになるだけだよ
アベノセイダーズは不具合を見つけてくるまで決して許さない
アベノセイダーズは不具合を見つけてくるまで決して許さない
792デフォルトの名無しさん
2021/10/20(水) 13:39:14.76ID:glY3n63N >>789
コストラクタでラムダ式をメンバ変数に受け取りデストラクタでそのラムダ式のメンバ変数を実行するクラステンプレートを自作すれば問題解決
コストラクタでラムダ式をメンバ変数に受け取りデストラクタでそのラムダ式のメンバ変数を実行するクラステンプレートを自作すれば問題解決
793デフォルトの名無しさん
2021/10/20(水) 13:41:35.24ID:NsIIvpqv fseekの引数はなぜああしたんだろうね
794デフォルトの名無しさん
2021/10/20(水) 13:46:56.17ID:glY3n63N 宇宙人がいないことを証明するための労力たるや
795デフォルトの名無しさん
2021/10/20(水) 13:50:04.27ID:NMVwWGr0 不都合があるという主張であろうと
不都合がないという主張であろうと
自分でコード書けないゴミは引っ込んでろ
不都合がないという主張であろうと
自分でコード書けないゴミは引っ込んでろ
796デフォルトの名無しさん
2021/10/20(水) 13:53:43.95ID:glY3n63N >>795
そのとおりだな、まずお前が引っ込め
そのとおりだな、まずお前が引っ込め
797デフォルトの名無しさん
2021/10/20(水) 14:13:30.21ID:glY3n63N 再帰呼び出し
我々の宇宙は高度な文明を持つ知的生命体の実験により作られたものであると推測するハーバード大学の科学者 : カラパイア
https://karapaia.com/archives/52306877.html
我々の宇宙は高度な文明を持つ知的生命体の実験により作られたものであると推測するハーバード大学の科学者 : カラパイア
https://karapaia.com/archives/52306877.html
798デフォルトの名無しさん
2021/10/20(水) 14:38:01.57ID:NMVwWGr0799デフォルトの名無しさん
2021/10/20(水) 14:47:18.86ID:BFKUlxpT #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は超えられてる模様
#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は超えられてる模様
800デフォルトの名無しさん
2021/10/20(水) 15:12:34.13ID:glY3n63N801デフォルトの名無しさん
2021/10/20(水) 15:18:25.38ID:BFKUlxpT 今日は2つのIDで頑張ってるみたいだね
802デフォルトの名無しさん
2021/10/20(水) 15:29:22.63ID:NMVwWGr0 プログラム技術板の正規メンバに
クソ以外の乞食が何か寝言ぬかしとんな
クソ以外の乞食が何か寝言ぬかしとんな
803デフォルトの名無しさん
2021/10/20(水) 15:34:29.03ID:glY3n63N お前らの家の冷蔵庫にエルビス・プレスリーがいないからといって、この世にエルビス・プレスリーがいないことの証明にはならないんだよ
血を吐くまで探せ
血を吐くまで探せ
804デフォルトの名無しさん
2021/10/20(水) 15:55:06.91ID:4r95dvH8 不具合あるのを証明したほうがてっとりばやい
805デフォルトの名無しさん
2021/10/20(水) 16:02:32.88ID:glY3n63N あぁ?わかって言ってんのか?
泥棒の証拠を泥棒に探させるのがアベガー品質だぞ
泥棒の証拠を泥棒に探させるのがアベガー品質だぞ
806デフォルトの名無しさん
2021/10/20(水) 16:09:49.79ID:Px+syONf807デフォルトの名無しさん
2021/10/20(水) 16:17:28.71ID:glY3n63N 挙証責任をガン無視できる文部科学省元事務次官前川喜平こそ最強
座右の銘は面従腹背、ライフワークは貧困調査
座右の銘は面従腹背、ライフワークは貧困調査
808デフォルトの名無しさん
2021/10/20(水) 16:39:46.06ID:NMVwWGr0 キチガイ極左は内ゲバで共食いしとれ
809デフォルトの名無しさん
2021/10/21(木) 00:40:30.45ID:ObBh/rk9 >>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を返していた
俺は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を返していた
810デフォルトの名無しさん
2021/10/21(木) 00:51:53.61ID:l0SlZ35R 話の肝は「私が間違ってました。ごめんなさい」と素直に言えるかどうかなわけで
小室文書みたいな屁理屈の羅列はいらねンだわ
小室文書みたいな屁理屈の羅列はいらねンだわ
811デフォルトの名無しさん
2021/10/21(木) 01:06:38.58ID:5bux1k1I812デフォルトの名無しさん
2021/10/21(木) 01:19:29.04ID:ObBh/rk9 ちなみに>>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
$
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
$
813デフォルトの名無しさん
2021/10/21(木) 03:46:14.13ID:Y6x8PTxQ >>811
前者がmadeで後者がmaidだからじゃね?
前者がmadeで後者がmaidだからじゃね?
814デフォルトの名無しさん
2021/10/21(木) 07:45:14.90ID:5PpYpVBN 以前はメードだったと思うけどね
815デフォルトの名無しさん
2021/10/21(木) 11:19:37.65ID:l0SlZ35R ババ抜きはOld maidの日本語訳だよ
セクシズムやエイジズムはポリコレの立場から見てどうだろうね
セクシズムやエイジズムはポリコレの立場から見てどうだろうね
816デフォルトの名無しさん
2021/10/21(木) 12:39:37.82ID:u1ltZUWw regexで\dを使いたい場合はどうやるん?
817デフォルトの名無しさん
2021/10/21(木) 14:10:28.52ID:ObBh/rk9818デフォルトの名無しさん
2021/10/21(木) 17:33:55.95ID:MfhbDLcG >>812
その比較でなんで fread だけ遅いんだ?と思ってコード見たら fread じゃなくて fgets になってた。
あと read_cpp_standard() の if (std::cin.fail()) もたぶん f.fail() の間違い。
その比較でなんで fread だけ遅いんだ?と思ってコード見たら fread じゃなくて fgets になってた。
あと read_cpp_standard() の if (std::cin.fail()) もたぶん f.fail() の間違い。
819デフォルトの名無しさん
2021/10/21(木) 18:24:19.20ID:/1ln80gU >>815
フェミが言葉狩りのネタにしないのは何故
フェミが言葉狩りのネタにしないのは何故
820デフォルトの名無しさん
2021/10/21(木) 18:42:48.64ID:7ERuyWg6 言葉狩りなんてないから
821デフォルトの名無しさん
2021/10/21(木) 18:56:39.47ID:ObBh/rk9 >>818
thx
>>812のコードは脳内破棄してくれ
指摘された部分を修正した
https://ideone.com/DoI3ww
同環境での測定結果が↓
214
213
214
freadだとバッファリングされるからその分遅いのかと勝手に思ってたらそんなところから間違ってたとはすまんw
thx
>>812のコードは脳内破棄してくれ
指摘された部分を修正した
https://ideone.com/DoI3ww
同環境での測定結果が↓
214
213
214
freadだとバッファリングされるからその分遅いのかと勝手に思ってたらそんなところから間違ってたとはすまんw
822デフォルトの名無しさん
2021/10/22(金) 00:41:05.61ID:bIdSm1HR BB抜きが有ってGG抜きが無いのは差別
823デフォルトの名無しさん
2021/10/22(金) 00:43:55.21ID:bIdSm1HR >>821
fread最強でFA
fread最強でFA
824デフォルトの名無しさん
2021/10/22(金) 01:17:58.50ID:JLUkeFzw freadのバイナリな
DMA効くのは
テキストはゴミ
DMA効くのは
テキストはゴミ
825デフォルトの名無しさん
2021/10/22(金) 02:55:23.69ID:ugOmuUc2 >>822
ジジ抜きもあるよ。
ジジ抜きはジョーカーを使わない。
適当な札を一枚抜いておいて組にならない札を最後まで持ってた奴が負け。
どれが負け札なのか最後までわからないというのがゲームの面白い部分。
ちなみに日本語でジジ抜きと呼ばれているゲームこそが Old maid (行き遅れ、お局様) の本来のルールで、
ペア (結婚相手) がないことを Old maid に喩えた命名になっている。
ジジ抜きもあるよ。
ジジ抜きはジョーカーを使わない。
適当な札を一枚抜いておいて組にならない札を最後まで持ってた奴が負け。
どれが負け札なのか最後までわからないというのがゲームの面白い部分。
ちなみに日本語でジジ抜きと呼ばれているゲームこそが Old maid (行き遅れ、お局様) の本来のルールで、
ペア (結婚相手) がないことを Old maid に喩えた命名になっている。
826デフォルトの名無しさん
2021/10/22(金) 05:43:15.83ID:I4IH0MDY C++20ちょっと書き始めたらvscodeのインテリセンスが何でもないところにエラーの波線出しまくってくる
827デフォルトの名無しさん
2021/10/22(金) 07:07:31.23ID:viI1I/mh DMAか、懐かしい
828デフォルトの名無しさん
2021/10/22(金) 12:50:15.03ID:xpSH/+fs >>826
どの環境でそうなる?
どの環境でそうなる?
829デフォルトの名無しさん
2021/10/22(金) 13:37:10.17ID:I4IH0MDY >>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でも言えるけど
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でも言えるけど
830デフォルトの名無しさん
2021/10/22(金) 23:23:13.68ID:Q/4+pM2R 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>>)
のような不定型配列を複数引数に取る関数を作りたいです。
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>>)
のような不定型配列を複数引数に取る関数を作りたいです。
831デフォルトの名無しさん
2021/10/22(金) 23:45:34.05ID:vgFDGRgE std::variantつかうとか
832デフォルトの名無しさん
2021/10/23(土) 01:05:44.90ID:UQ/XjfNb >>830
出来るといえば出来るんだが、動的型っぽいことを C++ でやろうとすると煩雑だよ。
std::any は何でも格納できるが使うときには結局は元の型として取りださないといけない。
格納することが出来たとして、その後にどういう風に使うのかによってデザインの仕方がかわってくる。
出来るといえば出来るんだが、動的型っぽいことを C++ でやろうとすると煩雑だよ。
std::any は何でも格納できるが使うときには結局は元の型として取りださないといけない。
格納することが出来たとして、その後にどういう風に使うのかによってデザインの仕方がかわってくる。
833ハノン ◆QZaw55cn4c
2021/10/23(土) 01:33:33.73ID:0KDU0Kot >>830
C++17以降、へえ、こんなこともできるんだ… https://cpprefjp.github.io/reference/variant/variant.html
https://ideone.com/G8IPFR
>>831
ありがとうございます!
C++17以降、へえ、こんなこともできるんだ… https://cpprefjp.github.io/reference/variant/variant.html
https://ideone.com/G8IPFR
>>831
ありがとうございます!
835はちみつ餃子 ◆8X2XSCHEME
2021/10/23(土) 01:57:47.58ID:UQ/XjfNb >>834
クラスの設計段階で抽象クラスとの継承関係を作っておくだとかいった方法で多相にするのが
旧来からの方法で、それができるならそのほうがまともなものになると思うんだが、
そうは言ってもユーザーからは弄れない既存のクラスをどうしても使いたいということも無くはない。
根本的な部分をいじれないときに場当たり的にどうにかするよりは std::any や std::variant を使ったら
少しはマシかもねという程度の話で、あまり積極的に使うようなものではないというのが私の感触だな。
クラスの設計段階で抽象クラスとの継承関係を作っておくだとかいった方法で多相にするのが
旧来からの方法で、それができるならそのほうがまともなものになると思うんだが、
そうは言ってもユーザーからは弄れない既存のクラスをどうしても使いたいということも無くはない。
根本的な部分をいじれないときに場当たり的にどうにかするよりは std::any や std::variant を使ったら
少しはマシかもねという程度の話で、あまり積極的に使うようなものではないというのが私の感触だな。
836デフォルトの名無しさん
2021/10/23(土) 08:10:22.62ID:LycCK1PV void*よりはちょっとマシって程度の感覚だな
837デフォルトの名無しさん
2021/10/23(土) 10:04:52.59ID:rMqegMI3838デフォルトの名無しさん
2021/10/23(土) 10:05:50.17ID:bwy1yWHL void*「むかしはあんなに愛してくれたのに…」
839デフォルトの名無しさん
2021/10/23(土) 11:08:12.01ID:FGy8rv7m840デフォルトの名無しさん
2021/10/23(土) 11:40:12.00ID:KcnUiVki >>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が継承(実装)した方がいいと思うってこと?
>>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が継承(実装)した方がいいと思うってこと?
841はちみつ餃子 ◆8X2XSCHEME
2021/10/23(土) 13:07:50.50ID:UQ/XjfNb >>840
そう。 クラスごとに違う挙動が必要ならその違いはクラスの中に隠蔽されているべきで、
クラスを使う側で分岐するのはなんかちょっとあれだなという感じ。
型を調べて分岐するようなコードが嫌だから動的な型を調べる機能を意図的に入れなかった話は D&E にも書かれてる。
(最終的には typeid が導入されてしまったけど……)
ただそれは「型を追加したくなったら分岐も増やすのはめんどいしミスしそう」みたいな話なので、
十分に賢いユーティリティが標準で用意されている今ならそれほど強い動機でもないんだけどね。
そう。 クラスごとに違う挙動が必要ならその違いはクラスの中に隠蔽されているべきで、
クラスを使う側で分岐するのはなんかちょっとあれだなという感じ。
型を調べて分岐するようなコードが嫌だから動的な型を調べる機能を意図的に入れなかった話は D&E にも書かれてる。
(最終的には typeid が導入されてしまったけど……)
ただそれは「型を追加したくなったら分岐も増やすのはめんどいしミスしそう」みたいな話なので、
十分に賢いユーティリティが標準で用意されている今ならそれほど強い動機でもないんだけどね。
842デフォルトの名無しさん
2021/10/23(土) 13:12:23.67ID:quaWTEll C++はパラメトリック多相が無いからこういうのは面倒だよね。
とりあえずはstd::vector<std::function<std::string()>>に[v](){ return std::to_string(v); };
あたりを入れとくのが簡単かね。
conceptを「その制約を持つクラスの総称クラス」としてshared_ptrあたりで指定できるようになると便利なんだけどなぁ。
concept_shared_ptrとか用意してくれんかね。
とりあえずはstd::vector<std::function<std::string()>>に[v](){ return std::to_string(v); };
あたりを入れとくのが簡単かね。
conceptを「その制約を持つクラスの総称クラス」としてshared_ptrあたりで指定できるようになると便利なんだけどなぁ。
concept_shared_ptrとか用意してくれんかね。
843はちみつ餃子 ◆8X2XSCHEME
2021/10/23(土) 13:16:46.64ID:UQ/XjfNb >>837
any_cast での取り出しは「元の型」でなければならず、
string に変換可能な型であっても any_cast<string> は出来ない。
(やったら例外が飛ぶ)
最終的に文字列になると決めているなら文字列にしてから格納したほうがすっきりするんじゃないの。
any_cast での取り出しは「元の型」でなければならず、
string に変換可能な型であっても any_cast<string> は出来ない。
(やったら例外が飛ぶ)
最終的に文字列になると決めているなら文字列にしてから格納したほうがすっきりするんじゃないの。
844デフォルトの名無しさん
2021/10/23(土) 14:23:02.68ID:KcnUiVki >>841
まあそうだよね。ありがとう。
まあそうだよね。ありがとう。
845デフォルトの名無しさん
2021/10/24(日) 08:17:03.78ID:mo2+vXTQ846デフォルトの名無しさん
2021/10/24(日) 08:20:03.55ID:mo2+vXTQ847デフォルトの名無しさん
2021/10/24(日) 08:40:20.31ID:i4dOTOfz 上では例外安全にするとかしないとか言っていたような気がしたが少し主張が変わったのかな。
- 例外安全を求めるのは当然
- RAIIを使えば比較的例外安全を保証しやすい
- だからといってRAIIを使えば自動的に例外安全になるわけではない
結論としてはこんな感じだと思うが。
- 例外安全を求めるのは当然
- RAIIを使えば比較的例外安全を保証しやすい
- だからといってRAIIを使えば自動的に例外安全になるわけではない
結論としてはこんな感じだと思うが。
848デフォルトの名無しさん
2021/10/24(日) 08:41:27.07ID:7jz7Y9vl チェックして例外出さないと解放されないコード書いたのか…
849デフォルトの名無しさん
2021/10/24(日) 09:13:23.68ID:1SVJ9Wvp そりゃ例外安全もRAIIも魔法じゃないんだから使えば即安全になるというわけじゃないわな
「ちゃんと使えば」をすっ飛ばして>>845みたいなことを言い出すのも一種の思考停止だろうと思うわ
「ちゃんと使えば」をすっ飛ばして>>845みたいなことを言い出すのも一種の思考停止だろうと思うわ
850デフォルトの名無しさん
2021/10/24(日) 09:51:02.52ID:v4numFpL >>845
Barのデストラクタの責務は自分が確保したリソースをリークしないことだけだ
オブジェクトの外側でやってるスレッド間通信のことなんかBarは知らんし別に手当するだけの話
逆に聞くがRAIIを嫌がってBar* x = new Bar;とかにしたらなんか事態改善すんの?スレッド間通信を簡潔に書くための役に立つの?
Barのデストラクタの責務は自分が確保したリソースをリークしないことだけだ
オブジェクトの外側でやってるスレッド間通信のことなんかBarは知らんし別に手当するだけの話
逆に聞くがRAIIを嫌がってBar* x = new Bar;とかにしたらなんか事態改善すんの?スレッド間通信を簡潔に書くための役に立つの?
851デフォルトの名無しさん
2021/10/24(日) 10:24:44.80ID:P2kmr3bK そもそもRAIIが例外安全のためっていうイメージ全くないんだけど
リソースのお片付け(≒メモリリーク防止)が主目的ちゃうん?
リソースのお片付け(≒メモリリーク防止)が主目的ちゃうん?
852デフォルトの名無しさん
2021/10/24(日) 10:36:38.75ID:i4dOTOfz 例外が発生するとリソースを片付け損ねる場合があるってのが例外安全を欠く一番よくあるケースだと思うけど。
主目的がどうとかは別として。
主目的がどうとかは別として。
853デフォルトの名無しさん
2021/10/24(日) 10:45:51.44ID:NLtlOSxj >>845
例外を生じた場合でもXとなんらかの通信を行うべきなら
thread_connectionみたいなクラスを作ってデストラクタに整合性を保つためコードを書くのがいいかな
「アプリケーション固有の〜を送る」の部分にはそのオブジェクトのメソッド呼び出しにしておく
例外発生時にはデストラクタによってXスレッドに異常を通知してXスレッドが持つ状態の整合性を確保してもらう
Xに通知するのが単なる終了通知なら(成否を区別して処理しなくていいなら)全部デストラクタでいいかもね
例外を生じた場合でもXとなんらかの通信を行うべきなら
thread_connectionみたいなクラスを作ってデストラクタに整合性を保つためコードを書くのがいいかな
「アプリケーション固有の〜を送る」の部分にはそのオブジェクトのメソッド呼び出しにしておく
例外発生時にはデストラクタによってXスレッドに異常を通知してXスレッドが持つ状態の整合性を確保してもらう
Xに通知するのが単なる終了通知なら(成否を区別して処理しなくていいなら)全部デストラクタでいいかもね
854デフォルトの名無しさん
2021/10/24(日) 10:47:45.55ID:KyFc3YJo 結局コードがないのでまた空中戦になってますね
855デフォルトの名無しさん
2021/10/24(日) 11:38:44.49ID:IQSwOnqn 例外でデストラクタ呼ばないケースなんてあるんですか?
プログラム自体が止まるのは別として
プログラム自体が止まるのは別として
856デフォルトの名無しさん
2021/10/24(日) 12:07:45.68ID:KyFc3YJo リマインダー>>731
857デフォルトの名無しさん
2021/10/24(日) 14:38:53.43ID:KyFc3YJo これ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
#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
858ハノン ◆QZaw55cn4c
2021/10/24(日) 15:13:35.43ID:rOnHPdOM >>838
「「最初から void * な実体」は作らない」「void (*)(void *, ...) くらいまでがせいぜいだ」というように努めていた私は愛し方が足りなかったのでしょうか?
最近の愛し方:https://mevius.5ch.net/test/read.cgi/tech/1624028577/305
「「最初から void * な実体」は作らない」「void (*)(void *, ...) くらいまでがせいぜいだ」というように努めていた私は愛し方が足りなかったのでしょうか?
最近の愛し方:https://mevius.5ch.net/test/read.cgi/tech/1624028577/305
859はちみつ餃子 ◆8X2XSCHEME
2021/10/24(日) 18:37:46.86ID:SzIAMYLD >>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;
}
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;
}
860デフォルトの名無しさん
2021/10/24(日) 19:35:48.44ID:KyFc3YJo >>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したときだけなぜ判定失敗してくれるのかもう少し考えてみます。
ありがとうございました。
う〜ん、よく分かりませんね。確かに勝手に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したときだけなぜ判定失敗してくれるのかもう少し考えてみます。
ありがとうございました。
861はちみつ餃子 ◆8X2XSCHEME
2021/10/25(月) 00:43:36.43ID:dRHq7DJG >>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 を削るとエラーになるんだよな。
なんだかよくわかんないね。
左辺が曖昧だからかもしれない。
左辺の型を 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 を削るとエラーになるんだよな。
なんだかよくわかんないね。
862デフォルトの名無しさん
2021/10/25(月) 02:18:03.94ID:LmZJdmU+ >>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
度々ありがとうございます。再現確認したところ、確かに余計なテンプレート引数が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
863デフォルトの名無しさん
2021/10/25(月) 02:19:56.83ID:LmZJdmU+ 最後のコードは右上の設定ボタンから -std=c++17 を追加することで実行できます。
864デフォルトの名無しさん
2021/10/25(月) 13:57:01.70ID:p1HT8A4i iostreamのシフト演算子オーバーロードは文句を言われてるがrangesのoperator|のオーバーロードはどうなんですかね
865はちみつ餃子 ◆8X2XSCHEME
2021/10/25(月) 14:01:06.87ID:dRHq7DJG 感覚的にはまあ順当だろうと思う。
日付やパスで / を使うのに比べればよっぽど……。
日付やパスで / を使うのに比べればよっぽど……。
866デフォルトの名無しさん
2021/10/25(月) 15:38:37.13ID:x4U5y7kU 組み込みの意味を持たないオーバーロード専用演算子があれば良かったのにな
用意しておかなかったのはC++の初期デザインの失敗だったと思う
用意しておかなかったのはC++の初期デザインの失敗だったと思う
867デフォルトの名無しさん
2021/10/25(月) 16:09:42.75ID:SLeimCOK 意味を持たない演算子が意図せず呼ばれてしまうくらいならコンパイルエラーになったほうがマシでは
868はちみつ餃子 ◆8X2XSCHEME
2021/10/25(月) 17:28:55.78ID:dRHq7DJG ところで Haskell で一定の記号の組み合わせは何でも新しい演算子として定義できる仕組みがある。
!#$%&*+./<=>? あたりとその他 Unicode 内いくらかも含めた組み合わせで演算子を作っていい。
優先順位も決められるし左結合か右結合かも決められる。
事実上無制限に違う字面の演算子を作れるんだよ。
<?+> とか #-. とか <<-~ みたいな演算子が実際に使われてるわけ。
こういう極端なのはさすがにあまりうらやましくはないよな……。
>>866
かといって有限の演算子をある程度に多く用意したところでオーバーロードを許すなら
どこかで全然違う意味で使われることもあるのは避けようがないし、
C++ くらいにスッパリと諦めるのもそれはそれで思い切りが良くて良いと思う。
!#$%&*+./<=>? あたりとその他 Unicode 内いくらかも含めた組み合わせで演算子を作っていい。
優先順位も決められるし左結合か右結合かも決められる。
事実上無制限に違う字面の演算子を作れるんだよ。
<?+> とか #-. とか <<-~ みたいな演算子が実際に使われてるわけ。
こういう極端なのはさすがにあまりうらやましくはないよな……。
>>866
かといって有限の演算子をある程度に多く用意したところでオーバーロードを許すなら
どこかで全然違う意味で使われることもあるのは避けようがないし、
C++ くらいにスッパリと諦めるのもそれはそれで思い切りが良くて良いと思う。
869デフォルトの名無しさん
2021/10/25(月) 17:51:03.08ID:s1VnbLSn 演算子ってのはwellknownだからこそ意味があると思うんだけどな
演算子のオーバーロードもその“意味”から大きく逸脱しないことを求めていたと思うし
意味を持たないオーバーロード専用演算子ってのは
プログラマーによって意味が真逆になりかねないから危険だと思う
そんなことするぐらいなら普通に名前を付けて関数定義したほうがマシに思える
演算子のオーバーロードもその“意味”から大きく逸脱しないことを求めていたと思うし
意味を持たないオーバーロード専用演算子ってのは
プログラマーによって意味が真逆になりかねないから危険だと思う
そんなことするぐらいなら普通に名前を付けて関数定義したほうがマシに思える
870デフォルトの名無しさん
2021/10/25(月) 17:56:20.95ID:5fKOgArh そこら中訳わかんない記号だらけのソースとか悪夢でしかないなw
871デフォルトの名無しさん
2021/10/25(月) 18:04:59.44ID:LmZJdmU+ >>857の原因判明しました。
同一の問題がstackoverflowで解決されていたのでリンクだけ貼っておきます。
https://stackoverflow.com/questions/52845621/cant-stream-stdendl-with-overloaded-operator-for-stdvariant
上記に従った対策コードは以下のとおりです。
https://godbolt.org/z/8e9o3MnaG
同一の問題がstackoverflowで解決されていたのでリンクだけ貼っておきます。
https://stackoverflow.com/questions/52845621/cant-stream-stdendl-with-overloaded-operator-for-stdvariant
上記に従った対策コードは以下のとおりです。
https://godbolt.org/z/8e9o3MnaG
872デフォルトの名無しさん
2021/10/25(月) 20:01:58.87ID:VZsrHh6g >>866
リザーブの演算子持っとけって言いたいんだろうけどこう言う奴はいくつ持ってても足りねーとか言うからw
リザーブの演算子持っとけって言いたいんだろうけどこう言う奴はいくつ持ってても足りねーとか言うからw
873デフォルトの名無しさん
2021/10/25(月) 21:34:55.28ID:3IW01+t9 演算子オーバーロードって自分で書くにはいいけど他人のコードを読むのが地獄だな。
874デフォルトの名無しさん
2021/10/25(月) 21:35:04.23ID:EqTxifVC while (fread(&x, sizeof(double), 1, fin) > 0) {
fprintf(fout, "%5.4f\n", x);
}
こんな風に書くとコベリティ君がfreadは読み込んだバイト数を返すが使っていませんみたいなこと言い出すんだが
は?使ってますけど?みたいな気持ちしかないんだけど
何を求められてるんだろうか。
fprintf(fout, "%5.4f\n", x);
}
こんな風に書くとコベリティ君がfreadは読み込んだバイト数を返すが使っていませんみたいなこと言い出すんだが
は?使ってますけど?みたいな気持ちしかないんだけど
何を求められてるんだろうか。
875デフォルトの名無しさん
2021/10/26(火) 06:12:19.30ID:lDQyydUS >>874
そんなのシノプシスに聞けよ…
そんなのシノプシスに聞けよ…
876デフォルトの名無しさん
2021/10/26(火) 06:48:54.44ID:ch+2e+/f >>870
昔のAPLとかかw
昔のAPLとかかw
877デフォルトの名無しさん
2021/10/26(火) 08:08:42.05ID:a/qQal0X 演算子に限らず、ある関数を特定の名前空間の内部だけ使えるように限定できたっけ?
「あるスコープだけこういう使い方」ならまだ混乱も少ないかね。
「あるスコープだけこういう使い方」ならまだ混乱も少ないかね。
878デフォルトの名無しさん
2021/10/26(火) 08:14:06.41ID:FOkaXEb/ ん? それこそが名前空間の可視性制御だろ
879デフォルトの名無しさん
2021/10/26(火) 08:14:48.16ID:X4knYEql 関数内で構造体を定義し、その中でstatic関数を定義する
880デフォルトの名無しさん
2021/10/26(火) 08:15:27.77ID:X4knYEql あ、違った
class内のprivate関数でいいんじゃね
class内のprivate関数でいいんじゃね
881デフォルトの名無しさん
2021/10/26(火) 08:27:02.14ID:cqUp+YH+882デフォルトの名無しさん
2021/10/26(火) 09:22:33.47ID:tIXOLnPL883デフォルトの名無しさん
2021/10/26(火) 10:05:37.17ID:I5hwU/3x >>874
fprintfはええんか?
fprintfはええんか?
884デフォルトの名無しさん
2021/10/26(火) 10:21:21.31ID:g/XkL0k7 niebloidの出番じゃないの?演算子オーバーロードには使えないが
885デフォルトの名無しさん
2021/10/26(火) 12:31:52.75ID:E+rw0Wy/886デフォルトの名無しさん
2021/10/26(火) 12:54:35.40ID:FaeDWsHu 今日もまた単発IDの曖昧発言onlyですね
887ハノン ◆QZaw55cn4c
2021/10/31(日) 10:43:09.43ID:hT9enBIH テステス
888デフォルトの名無しさん
2021/11/01(月) 17:04:38.20ID:uZUsIwlp std::function を引数にとる関数を作ってるんだが、参照で渡すのとコピーで渡すのでどのように動作が変わるかわからない
参照で渡して良いですか
参照で渡して良いですか
889デフォルトの名無しさん
2021/11/01(月) 17:28:34.89ID:2TKPTRzu std::funcて中身は関数ポインタ―でしょ
コピーで済むものを参照で渡す必要はそもそもないんじゃないの
受け取り先で書き換えて返すなら別だけど
コピーで済むものを参照で渡す必要はそもそもないんじゃないの
受け取り先で書き換えて返すなら別だけど
890はちみつ餃子 ◆8X2XSCHEME
2021/11/01(月) 17:29:06.34ID:w5vOXkrp >>888
「引数にとる」というのは実引数の型も std::function 型という意味?
「引数にとる」というのは実引数の型も std::function 型という意味?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【次の一手】台湾問題で小林よしのり氏が私見「まさに戦争前夜」「ただちに徴兵制を敷いて、高市支持者を最前線へ」… ★5 [BFU★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 ★2 [ぐれ★]
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- 俺「お湯を流してと…」シンク「ボンッw」
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- paypayで支払いするの便利すぎワロッタwwwwwwwwwwwwwww
- 山上徹也の妹なんでテロを肯定するようなこと言うんだい??
- もう寝ます
