[過去ログ] C++相談室 part164 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
270(1): (ワッチョイ 8101-1tDD) 2023/06/20(火)22:41 ID:vGfe0Eju0(6/7) AAS
>>269
これって関係ないif節はコンパイル時に消えるの?
271(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/20(火)22:43 ID:IIzrqfbq0(4/5) AAS
>>270
消えるよ。
272(1): (JP 0H91-FhUT) 2023/06/20(火)22:44 ID:Pk8V/jejH(2/4) AAS
>>269
ありがとうございます。
gcc 13.1.0 でc++17でうまくいきました。
後出しで申し訳ありませんが、C++14でかけませんか?
273(1): (ワッチョイ 8101-1tDD) 2023/06/20(火)22:47 ID:vGfe0Eju0(7/7) AAS
>>269,271
これは知らんかった
勉強になるなぁ
274(1): (JP 0H91-FhUT) 2023/06/20(火)22:48 ID:Pk8V/jejH(3/4) AAS
>>269
まさにこれをやりたかったです。
template<typename Callback>
void func(Callback cb)
{
// こことか
if constexpr (std::is_invocable_v<Callback, int>) {
省6
275(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/20(火)22:59 ID:IIzrqfbq0(5/5) AAS
>>272 >>274
ひとつの関数テンプレート中でやりたいってこと?
if constexpr が導入される前だとオーバーロードなり特殊化なりで
別の関数として分離しないと書けないと思う。
is_invocable に相当するものは自分で書こうと思えば書けるが
if constexpr は言語のコアの機能だからどうにもならんし……。
276: (JP 0H91-FhUT) 2023/06/20(火)23:14 ID:Pk8V/jejH(4/4) AAS
>>275
情報ありがとうございます
ご掲示いただいたコードで勉強になりました。
277: (ワッチョイ 69f0-J7ro) 2023/06/20(火)23:42 ID:zCL4VLm70(1/2) AAS
>>273
ザッツcostexprマジック
278: (ワッチョイ 69f0-J7ro) 2023/06/20(火)23:43 ID:zCL4VLm70(2/2) AAS
n抜けてたwコストがかかる演算なのは確かだけどw
constexprマジック!マジック!
279(2): (ワッチョイ 32fb-dYQK) 2023/06/21(水)00:07 ID:2lh42auf0(1/2) AAS
C++11のSFIANE地獄へようこそ
外部リンク:wandbox.org
template関数の実体化が1つだけ成功して、
他が失敗するように仕掛ければ呼び分けは可能。
ただ見ての通り相当面倒なことを書かなきゃならない。
280(1): (ワッチョイ 8101-1tDD) 2023/06/21(水)00:28 ID:CWKUsltc0(1/3) AAS
>>279
>>266と本質的に何が違うのか分からない
解説よろしく
(templateでやってることは無駄なのでは?)
281(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/21(水)00:41 ID:3HBFHOpK0(1/5) AAS
>>280
いや、 >>279 のほうがちょっと柔軟で使いやすい。
たとえば
void f3(long int, long int) {}
みたいなのを渡したとき >>266 ではエラーになる。
引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
厳密に int そのものでなければならないというのとでは制約の厳しさが違う。
282: (ワッチョイ 515f-9XmN) 2023/06/21(水)00:42 ID:LxMKpynY0(1) AAS
templateでやるのは質問者の与えた要件だな
宿題なんじゃね、しらんけど
283(1): (ワッチョイ 32fb-9xvA) 2023/06/21(水)00:52 ID:2lh42auf0(2/2) AAS
C++14にはif constexprが存在しないから
template使ったオーバーロードしか手段がない
質問者がC++14環境でって言ってたからこんなクソ面倒くさいことやれば一応できるっていう例示
284: (ワッチョイ 8101-1tDD) 2023/06/21(水)01:17 ID:CWKUsltc0(2/3) AAS
>>281,283
ありがとう
>引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
>厳密に int そのものでなければならないというのとでは制約の厳しさが違う。
こういうことね
285(2): (ワッチョイ a901-UvLK) 2023/06/21(水)04:29 ID:IDPPhD2V0(1/3) AAS
>>260
あー本来グローバルも対象になるのか、適当こいてスマソ
だが>>248で質問者が言ってるように、元のコードで順序を変えてもダメなのよ
何故か考えてはちみつのコードを以下のようにしたら同様に通らなかった
namespace ns {
template <class T = int>
struct foo{};
省12
286: (ワッチョイ a901-UvLK) 2023/06/21(水)09:44 ID:IDPPhD2V0(2/3) AAS
あ、すまんfooがクラステンプレートになってるの直し忘れた(直しても同じだが)
287: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/21(水)10:22 ID:3HBFHOpK0(2/5) AAS
>>285
名前探索 (name lookup) は狭い名前空間から探索していって
合致する名前があればそれより外側に同名の関数があっても
オーバーロード解決に参加しない。
わかりやすい例で言えばメンバ関数は非メンバより優先されるし、
メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。
void foo(void) {}
省9
288: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/21(水)10:34 ID:3HBFHOpK0(3/5) AAS
例をちょっと間違えたのでやりなおし。
void foo(int) {}
struct bar {
void baz(void) {
foo(1);
}
void foo(void) {}
省2
289: (ワッチョイ 8101-1tDD) 2023/06/21(水)11:00 ID:CWKUsltc0(3/3) AAS
g++更新にともない
自前ライブラリのビルドでエラーが出るようになって
悩んでたところを解説してくれてる
マジで凄い人達だな
290: (ワッチョイ a901-UvLK) 2023/06/21(水)11:31 ID:IDPPhD2V0(3/3) AAS
>メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。
thx。確かにこれ経験したことあるわ・・・ややこしいし名前変えて対処したけど
291: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/21(水)12:13 ID:3HBFHOpK0(4/5) AAS
>>285 の例は using を使う形でも解決できる。 (設計意図によってはそれが妥当かどうかわからんけど。)
namespace ns {
struct foo {};
struct hoge {};
int operator+(const hoge& x, const hoge& y) { return 1; }
};
ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); }
省9
292: (ワッチョイ ad10-fL0y) 2023/06/21(水)12:20 ID:s1sJDdcu0(1) AAS
C++って、こういう悪夢みたいなテクニックで溢れかえってるよなあ
RustやらPythonだのに人気が移るわけですよ
293: (テテンテンテン MM96-Axrn) 2023/06/21(水)12:23 ID:xjKiS8Z6M(1) AAS
記法でいうならNimがいいよ。
294: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/21(水)16:00 ID:3HBFHOpK0(5/5) AAS
カスタマイズされた関数が呼ばれるようにする綺麗な方法として customization point object という概念が近頃は導入されてる。
綺麗な方法というか汚い部分はライブラリに隠すってだけなんだけど。
真似してみてもいいかもね。
より綺麗な方法が導入されるのはいいんだけど、
過去の方法が消えてなくなるわけでもないし完全に置き換えられるわけでもないからなぁ。
個々には良くなっても全体としては余計に複雑になるだけってのもよくある話。
外部リンク:m.xkcd.com
295: (ワッチョイ c997-trtU) 2023/06/22(木)09:50 ID:+UOgHQ6A0(1) AAS
max RSS (メモリ総量) の取得ってWindowsとLinuxでポータブルな方法ないの?
296: (スプッッ Sd12-9xvA) 2023/06/22(木)10:07 ID:T+/An9G4d(1) AAS
C++標準ライブラリには無い
外部ライブラリに頼るか自分で実装するかになるけど、結局のところ#ifdefでOS依存の機能を呼び分けるしかない
297: (ワッチョイ 196e-ljvc) 2023/06/22(木)10:35 ID:myrOOi5M0(1) AAS
std::uintptr_t get_available_memory();
とプロトタイプだけ用意して、定義を環境別に作るだな
内容的に割と単純な処理のはずで
環境別に用意といってもたいした工数にはなるめえよ
298: (アウアウウー Sacd-Hkv7) 2023/06/22(木)17:54 ID:Sn58Ngpoa(1) AAS
Nim いいよね
C++ 嫌になったら Nim においでおいで
299(4): (ワッチョイ c997-trtU) 2023/06/23(金)06:00 ID:AFPisFIg0(1) AAS
なんかのオブジェクトをポインタじゃなく実体として持ってるとして、それを delete するやり方ってないの?
たとえば std::vector A に対して
delete &A;
みたいな
300: (ワッチョイ 92ad-DGQF) 2023/06/23(金)06:14 ID:Dz+tkRpF0(1/2) AAS
「実体を持っている」と言うが「誰が」持っているかにもよる
グローバル変数として宣言しているなら予めメモリ上に確保されているから破棄は無理(強引に再利用はできる)
スコープ内で変数として宣言したのなら必要なメモリはスタック上にあるからスタックを弄るしかない
別のオブジェクトのメンバ変数として宣言されているならそのオブジェクトを破棄する
301: (ワッチョイ 92ad-DGQF) 2023/06/23(金)06:17 ID:Dz+tkRpF0(2/2) AAS
スコープ内でってのはローカル変数の意味で言ったの
302: (ワッチョイ 3602-Ul6j) 2023/06/23(金)07:14 ID:GEB8UNzF0(1) AAS
A.~vector<>();でいいんじゃないの?
メモリ解放が必要ならdelete(void*)&A;とかして。
303: (ワッチョイ 196e-ljvc) 2023/06/23(金)07:18 ID:v++V1HM40(1/5) AAS
>>299
deleteはdynamic storage durationのオブジェクトにのみ許される
std::vector<int> A;はautomatic storage durationの場合はその定義を囲むブレースから逸脱すれば破棄される
static storage durationの場合はプログラムの実行終了時に破棄される
thread storage durationの場合はスレッド終了時に破棄される
304: (テテンテンテン MM96-Axrn) 2023/06/23(金)07:19 ID:pmKt7pYtM(1) AAS
極論すれば、c++の変数は自動変数しか無いから、変数で定義しているものはコンパイラに任せるしか無い。
305(1): (ワッチョイ 196e-ljvc) 2023/06/23(金)07:23 ID:v++V1HM40(2/5) AAS
> c++の変数は自動変数しか無い
???
306: (ワッチョイ adc9-1tDD) 2023/06/23(金)08:10 ID:Z0FiiE+w0(1) AAS
変数の生命期間よりも前に絶つのは new したものを delete する方法しかないよ
std::vector* pA = new std::vector();
std::vector& A = *pA;
:
Aで操作
:
delete pA;
省1
307: (ワッチョイ 196e-ljvc) 2023/06/23(金)08:36 ID:v++V1HM40(3/5) AAS
auto&& A { *new std::vector<int>(0) };
delete &A;
これで「実体」のように偽装はできるけど
こんなコード書くやついたらグーパンだよ
308: (ワッチョイ 92f0-L1I+) 2023/06/23(金)08:38 ID:OoWAXDqh0(1) AAS
このスレ読んでると目の裏がチカチカしてくるなw
309: (ワッチョイ f59c-Axrn) 2023/06/23(金)08:46 ID:z+mnuoLR0(1) AAS
>>305
極論すれば、と言っているだろ。
せめて反例ぐらい出せよ。
310(1): (ワッチョイ 196e-ljvc) 2023/06/23(金)09:45 ID:v++V1HM40(4/5) AAS
反例っておまえ・・・
静的変数
311(1): (ワッチョイ 0d4e-L1I+) 2023/06/23(金)10:11 ID:Zb3L9Wmq0(1) AAS
>>299
deleteで何をしたいかによるな
deleteは
・デストラクタを呼び出して
・メモリを開放する
という2つの動作が含まれるが、「メモリを開放する」に関しては、確保されてもいないメモリはもちろん開放できないが、
デストラクタは実体としてはただの関数なので、普通に呼び出すことは可能
省1
312: (ワッチョイ 8101-1tDD) 2023/06/23(金)11:56 ID:jOpqVfQE0(1) AAS
>>299
スコープを終わらせれば消える
313(2): (テテンテンテン MM96-UmNC) 2023/06/23(金)13:49 ID:RsoTpuHzM(1) AAS
Windows11でc++の開発したいんですけど開発環境何を選べばいいですか?
ちなみに趣味でおもちゃ言語のコンパイラを書こうと思います
314(1): (スッップ Sdb2-Ul6j) 2023/06/23(金)14:29 ID:P5Uu3Ce/d(1) AAS
wslのclangでいいんじゃないの
315: (ワッチョイ 515f-C6j3) 2023/06/23(金)14:40 ID:79pDbKtj0(1) AAS
>>311
> 2重に呼び出しても大丈夫なように設計されたクラスである必要はある
trivial destructor 以外は(空の ~T() {} 含め)どうがんばっても大丈夫にはならず未定義動作となる模様。
外部リンク[life]:timsong-cpp.github.io
316(3): (テテンテンテン MM96-UmNC) 2023/06/23(金)14:42 ID:XaN8/xk5M(1) AAS
>>314
visual studioでできませんか?
visual studioに依存しないような形で
317: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/23(金)14:49 ID:Xemzxb7u0(1/3) AAS
>>316
依存するかしないかはプログラマが気を付けることだろ
318: (ワッチョイ 196e-ljvc) 2023/06/23(金)14:58 ID:v++V1HM40(5/5) AAS
>>316
つーか俺はVisual Studioを推奨する
コンパイラ本体が昔からしっかりしてるし
デバッガは無数の信者を抱えるクオリティ
319: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/23(金)15:11 ID:Xemzxb7u0(2/3) AAS
俺はコンパイラは複数を利用するのが好ましいと思う。
気を付けてても処理系に依存している (または未定義を踏んでいる) こともある。
いくつかのコンパイラで試してみれば問題点を発見しやすい。
発現した問題についてはデバッガなりなんなりで追えばいいんだが、
問題が潜伏したまま表面に現れないってのは後になってじわじわ効いてきたりするし……。
320: (アウアウウー Sacd-Hkv7) 2023/06/23(金)16:11 ID:lCxAQSJFa(1/2) AAS
>>299
デストラクタに直接リソース解放させるより
リソース解放用の dispose() みたいな関数を造っておいて
デストラクタから dispose() 呼ぶのと同時に
delete しないで dispose() だけ外から呼ぶ設計もあるよ
321: (アウアウウー Sacd-Hkv7) 2023/06/23(金)16:14 ID:lCxAQSJFa(2/2) AAS
>>313
Code::Blocks (+ mingw)
322: (ワッチョイ 69f0-J7ro) 2023/06/23(金)18:47 ID:5tcqgCxE0(1/2) AAS
コンパイラの本なにがいいのかオススメ聞いたらオッサンに聞いたら怪獣が書いてある本って云われて本屋行って買ったらあとで付録のFDD誰かにかっぱわられていタコとに気付いたけどその本一冊ではなんの役にも立たないクソみたいな本だったわ
そのあとオライリーのyacc&lexの本と早乙女氏のBison&Flex本で学び直したわ
323: (ワッチョイ 69f0-J7ro) 2023/06/23(金)19:05 ID:5tcqgCxE0(2/2) AAS
良く見たら全然違ったわw
画像リンク[jpg]:i.imgur.com
yacc&lexが早乙女氏でBison&Flexが五月女氏でオライリーに似てるけどASCII出版やったわ
324(1): (テテンテンテン MM96-Axrn) 2023/06/23(金)19:51 ID:s3XGk2XtM(1) AAS
>>316
まず動くものを作ることに注力したほうがいい。
どうせ最初のコードは(問題領域の学習後に)捨てることになるから、プロトタイプと割り切るべき。あんまり頑張ると進捗悪くて挫折するし、うまく行ってもコンコルド効果で酷い目にあう。
>>310
確かに静的変数は自動だけど別物だな……よくやった。悔しいが褒めてやろう。
325: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/23(金)22:40 ID:Xemzxb7u0(3/3) AAS
>>324
???
storage duration は四種類の内の「ひとつ」であることは直接的に明記されていて解釈の余地がない。
外部リンク[stc]:timsong-cpp.github.io
兼ねる場合は存在しない。
326: (ワッチョイ 6501-2DXs) 2023/06/24(土)08:29 ID:31MSzc3x0(1) AAS
>まず動くものを作ることに注力したほうがいい。
+1票
>いくつかのコンパイラで試してみれば問題点を発見しやすい。
これはその通りだけど、もっともっと先の話
327(1): (ワッチョイ 856e-gmRT) 2023/06/24(土)09:51 ID:xNNc2oEW0(1) AAS
動くといってもHello worldじゃあまりにもモチベーションに乏しいから
何でもいいから目的目標を持ったプログラムを書いたほうがいい
328: はちみつ餃子◆8X2XSCHEME (ワッチョイ dd3e-F8yx) 2023/06/24(土)12:57 ID:rXisqo0O0(1) AAS
>>327
この話題の大元である >>313 でコンパイラを書くと書いてあるよ。
329: (ワッチョイ 6501-wYA+) 2023/06/24(土)20:48 ID:rm+SB6K20(1) AAS
ドラゴンブックでは?
誤植を指摘できるくらい読み込めば古典は理解できてると思う
330: (アウアウウー Sa69-F3wx) 2023/06/27(火)14:41 ID:DdZG5nY/a(1) AAS
いつまでも初心者を抜け出せない人は初心者本を読み過ぎ
331: (ワッチョイ 856e-gmRT) 2023/06/27(火)17:36 ID:59BI4JPS0(1/2) AAS
初心者本は【ど】初心者のうちだけにしとけ
謙虚なことはいいことだが、ここだけは背伸びしたほうがいい
初心者本で何か知ったら、それで禿本がどのくらい読めるようになったかやってみれ
禿本が普通に読めるようになったら次はISOの規格票
332: (ワッチョイ 856e-gmRT) 2023/06/27(火)17:38 ID:59BI4JPS0(2/2) AAS
逆もしかり
ISOの規格票であえなくギブしたら禿本
禿本でギブのとき初心者本に戻る感じな
333: (ワッチョイ 8d7c-BujW) 2023/06/27(火)18:00 ID:h1cnuIf90(1) AAS
特にC++は下手な参考書より規格の方が分かりやすかったりするからな…
334(1): (ワッチョイ dd4e-OfpS) 2023/06/27(火)18:15 ID:D2orubkn0(1) AAS
初心者へのアドバイスに禿本とかいう隠語をつかうのはどうかと思う
335(2): (ワッチョイ d5b3-q57E) 2023/06/27(火)18:27 ID:KKkR5HKI0(1/2) AAS
今独学でC++学んでいるんですが、たまたま見つけたサイトでint32_tとありましたが
int変数を宣言するのにint32_tなんて使いませんよね?
intでokですよね?
336: (ワッチョイ ad5f-VF0j) 2023/06/27(火)18:34 ID:3myjDgNL0(1) AAS
何に使うか次第
337: (ワッチョイ ad02-ES2+) 2023/06/27(火)18:46 ID:gpD88JT50(1) AAS
>>335
32ビット長である必要があるときだけint32_tを使えばいいよ
338: (ワッチョイ d5b3-q57E) 2023/06/27(火)19:26 ID:KKkR5HKI0(2/2) AAS
サンクス
339: はちみつ餃子◆8X2XSCHEME (ワッチョイ dd3e-F8yx) 2023/06/27(火)19:30 ID:wxXBe/Gr0(1) AAS
>>335
int は言語仕様では少なくとも -32767 から 32767 を表現可能な幅 (つまり 16 ビット) を持つことが規定されている。
具体的な大きさは処理系定義であって、最低限である 16 ビットかもしれないしもっと大きいかもしれない。
扱おうとする値の範囲が 32 ビット分の幅が必要であると見積もったなら int32_t が適切なこともある。
ただ…… int32_t は「条件に合致する整数型を処理系が持っているなら必ず提供しなければならない」ということになっているので、逆に言えば 32 ビット幅の整数型を持たない処理系では int32_t が存在しないことが許される。
C++ は処理系定義ということにしている項目がたくさんあって移植性を考慮しようとするとすごく大変なんだが (プログラマが想定してさえいれば) ある程度に広く対応可能な仕組みとしてこういう回りくどいものがある。
初心者の内はとりあえず自分の環境で動くものを作れるようになるというので十分だと思うよ。
340(3): (ワッチョイ 856e-gmRT) 2023/06/28(水)05:36 ID:p/gJzJ+n0(1/3) AAS
>>334
知らなきゃ聞くだろ
341: (スッップ Sd43-KhjG) 2023/06/28(水)05:40 ID:PRZu9/2Od(1) AAS
>>340
禿本って誰ですか?
342: (ワッチョイ 856e-gmRT) 2023/06/28(水)07:54 ID:p/gJzJ+n0(2/3) AAS
Bjarne Stroustrup著 The C++ Programming Language
ISBN-10 4797375957
343: (ワッチョイ 856e-gmRT) 2023/06/28(水)07:55 ID:p/gJzJ+n0(3/3) AAS
禿のブログ
外部リンク:www.stroustrup.com
344: (ワッチョイ dd4e-OfpS) 2023/06/28(水)11:12 ID:MFKAAcNx0(1) AAS
>>340
誰も知らないから隠語なんだよ
たまにいるよな、相手の知らないであろう単語を使ってマウントを取った気分になるやつ
345: (テテンテンテン MM4b-HUf/) 2023/06/28(水)12:11 ID:gg0vhlU/M(1) AAS
>>340
検索すると別人の本が出てくるから駄目だろ。
346: (ワッチョイ 23f0-OfpS) 2023/06/29(木)00:03 ID:XHjEw6wR0(1/2) AAS
C++でintと書けない理由はほぼほぼwindowsのintが32ビットと定義されているからで、
逆に言えば100% windowsで動かさないとあらかじめ分かっているならint使って書くよ
347: (ワッチョイ 4be5-O9q2) 2023/06/29(木)07:49 ID:0UnKiO4J0(1) AAS
せいぜい数十までの整数でも、いちいちint8_tになんかしねえな
348(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ dd3e-F8yx) 2023/06/29(木)08:15 ID:l+ZsGqGg0(1/3) AAS
巨大な配列なら話は別だが単発の整数がレジスタより小さくても得なことが無いからな。
349: (ワッチョイ 9dc9-3ptY) 2023/06/29(木)08:19 ID:beCjxg/z0(1) AAS
通信関連でペイロードに ビット長指定されてるのなんかは int○_t 使っときたい
350: (ワッチョイ 8590-bmws) 2023/06/29(木)11:02 ID:prJHgW/t0(1/2) AAS
intでもshortでもCPUの計算速度は同じ
上下前次1-新書関写板覧索設栞歴
あと 652 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.030s