探検
0からの、超初心者C++相談室
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2018/11/12(月) 14:55:13.35ID:Tf74ZWQr 何にも知らない0からの出発、超初心者のためのC++相談室
795デフォルトの名無しさん
2024/02/11(日) 22:45:16.04ID:KNbj1ANO >>794
c2.insert(c1.begin (), c1.end ());
c2.insert(c1.begin (), c1.end ());
796はちみつ餃子 ◆8X2XSCHEME
2024/02/12(月) 11:50:11.55ID:4VueJhli >>794
set に set を insert できる「だけ」ってのはあまり便利ではない。
集合というものをより汎用的に扱える枠組みとして C++20 から range という概念が導入された。
その枠組みを上手いこと成立させる言語機能 concept が長いこと検討されてて、
入る入ると言いながら C++20 までずれ込んでしまったという事情がある。
そんなわけで、 C++23 からなら insert_range が使えて、
これは range の条件を満たすものならなんでも受け入れられることになってる。
set に set を insert できる「だけ」ってのはあまり便利ではない。
集合というものをより汎用的に扱える枠組みとして C++20 から range という概念が導入された。
その枠組みを上手いこと成立させる言語機能 concept が長いこと検討されてて、
入る入ると言いながら C++20 までずれ込んでしまったという事情がある。
そんなわけで、 C++23 からなら insert_range が使えて、
これは range の条件を満たすものならなんでも受け入れられることになってる。
797デフォルトの名無しさん
2024/02/12(月) 21:37:56.53ID:WngRm50l >>794
c2.merge(c1) ※C++17以降
c2.merge(c1) ※C++17以降
798デフォルトの名無しさん
2024/02/13(火) 22:11:49.56ID:TA8E1xmn みなさんありがとう。環境適合を優先して>>795を使うことにします。
799デフォルトの名無しさん
2024/02/18(日) 00:05:28.51ID:AtsZxBPF コンストラクタの初期化子リストの中で、どこまで柔軟に記述できるのかなーと思ってGPT先生に聞いたら、constまたはconstexprを返す関数のみ書けるとのことでした。
コンストラクタ内部のように好きなように書けないとわかり、初期化子リストの価値が低く感じられました。
そんな制限を設けてまで初期化子リストを導入した意図は何でしょう。
コンストラクタ内部のように好きなように書けないとわかり、初期化子リストの価値が低く感じられました。
そんな制限を設けてまで初期化子リストを導入した意図は何でしょう。
800デフォルトの名無しさん
2024/02/18(日) 01:13:17.69ID:UTNyRtZE ChatGPTなんかあてにするな、平気で間違ったこと言うんだから
constやconstexpr以外を返す関数だって普通に呼べる
試しにChatGPTに「メンバ初期化子リストではconstかconstexprを返す関数しか呼べませんが、これはなぜですか?」ってあえて間違った前提条件で質問してみたら、間違ってることに対する指摘は一切なかったし、さもこっちの質問が正しいかのようなそれっぽい返答が返ってきたし
---
俺:
C++において、コンストラクタのメンバ初期化子リスト内ではconstまたはconstexprを返す関数しか呼ぶことができません。これはなぜでしょうか?
ChatGPT:
C++において、コンストラクタのメンバ初期化子リスト内でconstまたはconstexprを返す関数しか呼ぶことができる理由は、初期化子リストがオブジェクトの初期化に使用され、実行時のコードが生成されないためです。メンバ初期化子リストはコンストラクタの一部であり、オブジェクトが生成される際に実行されます。このリスト内での関数呼び出しはコンパイル時に解決され、オブジェクトの初期化に関する情報は実行時に生成されません。
constまたはconstexprを返さない関数をメンバ初期化子リスト内で呼ぶと、実行時にコードが生成される可能性があります。しかし、これはオブジェクトが生成される前に行われる初期化の一環であり、実行時の処理としては不要なオーバーヘッドを引き起こす可能性があります。
コンストラクタのメンバ初期化子リストは、メンバ変数を適切に初期化するためのものであり、できるだけ効率的に行われるように設計されています。そのため、コンパイル時に解決されるconstまたはconstexprを返す関数の呼び出しに限定されています。
---
だからAIをあてにしちゃダメだよ
constやconstexpr以外を返す関数だって普通に呼べる
試しにChatGPTに「メンバ初期化子リストではconstかconstexprを返す関数しか呼べませんが、これはなぜですか?」ってあえて間違った前提条件で質問してみたら、間違ってることに対する指摘は一切なかったし、さもこっちの質問が正しいかのようなそれっぽい返答が返ってきたし
---
俺:
C++において、コンストラクタのメンバ初期化子リスト内ではconstまたはconstexprを返す関数しか呼ぶことができません。これはなぜでしょうか?
ChatGPT:
C++において、コンストラクタのメンバ初期化子リスト内でconstまたはconstexprを返す関数しか呼ぶことができる理由は、初期化子リストがオブジェクトの初期化に使用され、実行時のコードが生成されないためです。メンバ初期化子リストはコンストラクタの一部であり、オブジェクトが生成される際に実行されます。このリスト内での関数呼び出しはコンパイル時に解決され、オブジェクトの初期化に関する情報は実行時に生成されません。
constまたはconstexprを返さない関数をメンバ初期化子リスト内で呼ぶと、実行時にコードが生成される可能性があります。しかし、これはオブジェクトが生成される前に行われる初期化の一環であり、実行時の処理としては不要なオーバーヘッドを引き起こす可能性があります。
コンストラクタのメンバ初期化子リストは、メンバ変数を適切に初期化するためのものであり、できるだけ効率的に行われるように設計されています。そのため、コンパイル時に解決されるconstまたはconstexprを返す関数の呼び出しに限定されています。
---
だからAIをあてにしちゃダメだよ
801デフォルトの名無しさん
2024/02/19(月) 00:17:49.94ID:bJlSKdBs >>800
私が聞いたときも似たような内容が含まれていて、そうなんだねと納得してしまいました。
ではコンストラクタに書けることはすべて書けるのですね。
なおこの問いは、入門書籍にはそこまで書かれてなくて、検索でもかんたんに見つからなかったので聞きました。
私が聞いたときも似たような内容が含まれていて、そうなんだねと納得してしまいました。
ではコンストラクタに書けることはすべて書けるのですね。
なおこの問いは、入門書籍にはそこまで書かれてなくて、検索でもかんたんに見つからなかったので聞きました。
802はちみつ餃子 ◆8X2XSCHEME
2024/02/19(月) 02:33:45.03ID:j7eyydGe >>801
たぶん >>799 で言う「初期化子リスト」は「メンバ初期化子リスト」だよね?
これらは全くの別物。
明らかに混同しやすい用語だから仕方がない部分はあるんだが、
誤った用語を元に調べたら誤った解説に当たりやすいかもしれない。
メンバ初期化子リストは直接初期化 (direct-initialization) であると規定されていて
具体的な挙動の説明は初期化の章に丸投げされている。
https://timsong-cpp.github.io/cppwp/n3337/class.base.init#7
つまりメンバ初期化子リストに特有の事情というものはない。
普通に初期化なんで、そこに違いがあるかもしれないという想像をする人がいてそういう人のために
違いが無いと断りを入れる必要があるとは入門書の著者は思わなかったんだろう。
有るものを有ると説明することはあるが無いものを無いと殊更に強調して説明はあまりしない。
たぶん >>799 で言う「初期化子リスト」は「メンバ初期化子リスト」だよね?
これらは全くの別物。
明らかに混同しやすい用語だから仕方がない部分はあるんだが、
誤った用語を元に調べたら誤った解説に当たりやすいかもしれない。
メンバ初期化子リストは直接初期化 (direct-initialization) であると規定されていて
具体的な挙動の説明は初期化の章に丸投げされている。
https://timsong-cpp.github.io/cppwp/n3337/class.base.init#7
つまりメンバ初期化子リストに特有の事情というものはない。
普通に初期化なんで、そこに違いがあるかもしれないという想像をする人がいてそういう人のために
違いが無いと断りを入れる必要があるとは入門書の著者は思わなかったんだろう。
有るものを有ると説明することはあるが無いものを無いと殊更に強調して説明はあまりしない。
803デフォルトの名無しさん
2024/02/19(月) 22:58:00.95ID:bJlSKdBs804デフォルトの名無しさん
2024/02/26(月) 09:17:00.78ID:KZUiymUx すみません、コンストラクタの宣言/定義で A() {}; とした場合と A() = default; と
書いた場合は何が違うのでしょうか。挙動とか意味だとか...
あるいはある種のタイプクラスの場合は違いが生じるので注意とか....??
書いた場合は何が違うのでしょうか。挙動とか意味だとか...
あるいはある種のタイプクラスの場合は違いが生じるので注意とか....??
805はちみつ餃子 ◆8X2XSCHEME
2024/02/26(月) 09:36:14.06ID:pFLZLcAJ >>804
default を指定した場合はデフォルトのルールでコンストラクタを生成する。
生成可能な条件が満たされなかった場合でもそれ自体はエラーにはならずに
デフォルトコンストラクタは削除済と見做されるというルール。
そのときはデフォルトコンストラクタを必要とする使い方をした時点でエラーになる。
default を指定した場合はデフォルトのルールでコンストラクタを生成する。
生成可能な条件が満たされなかった場合でもそれ自体はエラーにはならずに
デフォルトコンストラクタは削除済と見做されるというルール。
そのときはデフォルトコンストラクタを必要とする使い方をした時点でエラーになる。
806はちみつ餃子 ◆8X2XSCHEME
2024/02/26(月) 09:39:35.86ID:pFLZLcAJ つまりこんなことをしてもエラーは出ないが
struct foo {
foo() = delete; // デフォルトコンストラクタを削除
};
struct bar : foo {
bar() = default; // デフォルトコンストラクタのデフォルト生成
};
int main(void) {
}
↓ こういうことをするとエラー
struct foo {
foo() = delete; // デフォルトコンストラクタを削除
};
struct bar : foo {
bar(){}
};
int main(void) {
}
struct foo {
foo() = delete; // デフォルトコンストラクタを削除
};
struct bar : foo {
bar() = default; // デフォルトコンストラクタのデフォルト生成
};
int main(void) {
}
↓ こういうことをするとエラー
struct foo {
foo() = delete; // デフォルトコンストラクタを削除
};
struct bar : foo {
bar(){}
};
int main(void) {
}
807デフォルトの名無しさん
2024/03/02(土) 19:28:56.45ID:fBQwxymt >>806
遅レスすみません。要は、コンストラクタの特定のパターンの用法をされたくない
ときに使う感じ? でそれに該当するとコンパイルエラーになるわけですよね?
自分が気になったのは、ランタイム時に何かありうるかということです
あるコードで、コンストラクタがdefault指定されているクラスが、別のクラス内
(親子関係にはない)でunique_ptrとして生成されたときに問題が生じたような
感じで....
ってもっと自分で調べてからレスしろって話ですが、現在そのコードに立ち戻る
ことができず、とりあえず疑問だけを
遅レスすみません。要は、コンストラクタの特定のパターンの用法をされたくない
ときに使う感じ? でそれに該当するとコンパイルエラーになるわけですよね?
自分が気になったのは、ランタイム時に何かありうるかということです
あるコードで、コンストラクタがdefault指定されているクラスが、別のクラス内
(親子関係にはない)でunique_ptrとして生成されたときに問題が生じたような
感じで....
ってもっと自分で調べてからレスしろって話ですが、現在そのコードに立ち戻る
ことができず、とりあえず疑問だけを
808はちみつ餃子 ◆8X2XSCHEME
2024/03/02(土) 21:07:53.65ID:JOojncXx C++ の仕様は場合分けで規則がごちゃごちゃしていることが多くて単純な一般原則として説明できない。
「要は」なんて一言でまとめられないよ。
「要は」なんて一言でまとめられないよ。
809デフォルトの名無しさん
2024/03/03(日) 19:37:10.80ID:HNPAS3Wj810デフォルトの名無しさん
2024/03/12(火) 20:26:30.54ID:lzPsc8Dg 異なる型を含むような配列(的なもの)を作りたいのですが、可能でしょうか?
例えば template <T> struct NamedValue { string name; T value; } を定義して
NamedValue<string>{a, b} や NamedValue<int>{c, d} などの型の異なる複数の値を、
一つの配列的なものに収納したいのです
例えばvectorは全要素が同じ型じゃないと駄目ですよね
例えば template <T> struct NamedValue { string name; T value; } を定義して
NamedValue<string>{a, b} や NamedValue<int>{c, d} などの型の異なる複数の値を、
一つの配列的なものに収納したいのです
例えばvectorは全要素が同じ型じゃないと駄目ですよね
811デフォルトの名無しさん
2024/03/12(火) 21:14:27.11ID:irRbCjS4 >>810
std::tuple
std::tuple
812デフォルトの名無しさん
2024/03/12(火) 21:19:48.50ID:irRbCjS4 あるいは要素数がコンパイル時に決まらないなら
std::anyをコンテナに入れるとか?
std::anyをコンテナに入れるとか?
813デフォルトの名無しさん
2024/03/12(火) 22:11:10.08ID:lzPsc8Dg はい、要素数はコンパイル時に決まらないのでstd::anyのコンテナですかね
で要素を取り出すときは、どの型なのかをチェックして挙動を...
で要素を取り出すときは、どの型なのかをチェックして挙動を...
814はちみつ餃子 ◆8X2XSCHEME
2024/03/12(火) 23:03:39.03ID:WtXn1sYk もし >>810 の T の種類が限られているのなら std::variant を使ったほうが楽かもしれない。
std::visit を使えば型の種類ごとに処理を切り替えるのが便利なことがある。
std::visit を使えば型の種類ごとに処理を切り替えるのが便利なことがある。
815デフォルトの名無しさん
2024/03/23(土) 11:43:27.62ID:YZ3MX9tD std::remove()ってファイルを消去する関数なんですね
std::move()と名前が似ているのに全然違う
std::move()と名前が似ているのに全然違う
816デフォルトの名無しさん
2024/03/23(土) 12:38:58.15ID:6dCwgWlj 名前空間か関数名にfileくらい入れとけって思うよね
817デフォルトの名無しさん
2024/03/23(土) 12:50:26.95ID:epZulncV C言語以前にE言語の問題や
さすがにそのくらいの英語の勉強はしておけと思う
さすがにそのくらいの英語の勉強はしておけと思う
818はちみつ餃子 ◆8X2XSCHEME
2024/03/23(土) 12:51:15.85ID:szITgpvT C の規格から取り込んだものだから由来が違うんだよ。
今なら std::filesystem::remove があるからこちらを使うほうが良い作法だと思う。
今なら std::filesystem::remove があるからこちらを使うほうが良い作法だと思う。
819デフォルトの名無しさん
2024/03/23(土) 12:54:13.64ID:aQWBK6SI >>815
>std::remove()ってファイルを消去する関数なんですね
std::remove()ってSTLのstd::removeじゃなく?
ちゃんとコンテナの要素をre-moveしてると思うが?
>std::remove()ってファイルを消去する関数なんですね
std::remove()ってSTLのstd::removeじゃなく?
ちゃんとコンテナの要素をre-moveしてると思うが?
820デフォルトの名無しさん
2024/03/23(土) 13:38:01.48ID:qgcdIGgP821デフォルトの名無しさん
2024/03/23(土) 13:40:27.68ID:qgcdIGgP ああ
<cstdio>に
int remove( const char* pathname );
ってのがあるのか
https://en.cppreference.com/w/cpp/io/c/remove
<cstdio>に
int remove( const char* pathname );
ってのがあるのか
https://en.cppreference.com/w/cpp/io/c/remove
822デフォルトの名無しさん
2024/03/24(日) 05:14:16.83ID:DBUI72Gl823デフォルトの名無しさん
2024/03/24(日) 09:50:29.58ID:FsPOi81N cstdio のは std:: 名前空間じゃないよね.
::remove だと思うけど
::remove だと思うけど
824はちみつ餃子 ◆8X2XSCHEME
2024/03/24(日) 12:13:25.60ID:iaJ2USO3 >>823
cstdio にある関数は std 名前空間にある。
ただしグローバル名前空間「にも」あって良い。 (無くても良い。)
stdio.h の場合はグローバル名前空間で宣言されるが std 「にも」あってよい。 (無くても良い。)
cstdio にある関数は std 名前空間にある。
ただしグローバル名前空間「にも」あって良い。 (無くても良い。)
stdio.h の場合はグローバル名前空間で宣言されるが std 「にも」あってよい。 (無くても良い。)
825デフォルトの名無しさん
2024/04/14(日) 11:55:59.92ID:Rac57Bvn ヒエッ……、、、ぎ、玉虫色……
826デフォルトの名無しさん
2024/04/20(土) 14:55:18.13ID:nh5GJjX6 言語そのものではないのですが、コマンドラインのデバッガやIDEでSTLのコンテナの内容を
易しく表示してくれるのってありますか?
例えばvectorなら、単純に中の要素だけを列挙してくれたりとか
ビルドにCMakeを使っているのでとりあえずCLionを使っていますが、これは
確かに変数の中身をリスト構造で見れますが、変数内の生のメンバー(M_なんちゃら等)
見えてる感じで、STLコンテナに関してはあまり親切ではないような
デバッグの際は見えた方がいい場合もあるのでしょうが。なら表示が切り替えられたりとか?
自分はmacOSですが、他のプラットフォームにしかないものも参考に聞いてみたいです
易しく表示してくれるのってありますか?
例えばvectorなら、単純に中の要素だけを列挙してくれたりとか
ビルドにCMakeを使っているのでとりあえずCLionを使っていますが、これは
確かに変数の中身をリスト構造で見れますが、変数内の生のメンバー(M_なんちゃら等)
見えてる感じで、STLコンテナに関してはあまり親切ではないような
デバッグの際は見えた方がいい場合もあるのでしょうが。なら表示が切り替えられたりとか?
自分はmacOSですが、他のプラットフォームにしかないものも参考に聞いてみたいです
827デフォルトの名無しさん
2024/04/26(金) 10:53:44.71ID:kftlKAnq 今からC++を勉強するならC++20を基準にやっても構いませんか?
828デフォルトの名無しさん
2024/04/26(金) 10:59:40.04ID:/+TxHGye c++20といわずc++23からやればいいのでは
829デフォルトの名無しさん
2024/04/26(金) 11:15:59.06ID:kftlKAnq 最新の規格で勉強して必要に応じて古い知識をつけていくような学び方でいいの?
830デフォルトの名無しさん
2024/04/26(金) 12:03:42.74ID:q/vvVdAs つべこべ言わずやれ
最短コースなんてない
最短コースなんてない
831デフォルトの名無しさん
2024/04/26(金) 13:37:23.03ID:+usxQk3U C++ は基礎の上に段階的に応用が乗っかっているような綺麗な構成ではない。
全部が入り組んで捏ねまわされてグダグダや。 そんでもってクソ巨大やねん。
どこから入っても同じ。
全部が入り組んで捏ねまわされてグダグダや。 そんでもってクソ巨大やねん。
どこから入っても同じ。
832デフォルトの名無しさん
2024/04/27(土) 18:08:12.52ID:nxPk0zOn 質問なのですが
std::string には std::to_string(int)他の簡単文字列化関数がありますが
std::basic_string<T> に対する簡単文字列化関数はどう?
std::string には std::to_string(int)他の簡単文字列化関数がありますが
std::basic_string<T> に対する簡単文字列化関数はどう?
833デフォルトの名無しさん
2024/04/27(土) 21:15:22.77ID:Zg+tfmdX >>826
WindowsのVisual Studioではできる
WindowsのVisual Studioではできる
834デフォルトの名無しさん
2024/04/28(日) 10:47:20.65ID:xKAeYuwJ 最初に学ぶ言語がC++なら、Cより学ぶのが大変じゃん
835832
2024/05/11(土) 19:13:43.45ID:RotYKdRC やっぱ数値から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 とかある
std::basic_string<T>でそれをやりたい人が対応せよ(std::basic_string<T>版to_string()やstd::ostrstreamをT毎に作成せよ)という天の啓示?
証拠にstd::wstringについてはstd::wstring to_wstring(int)とかstd::wostrstream とかある
836デフォルトの名無しさん
2024/05/13(月) 23:37:45.97ID:E3c8DTgZ >>835
分かっとるやないか
分かっとるやないか
837デフォルトの名無しさん
2024/05/17(金) 02:48:48.77ID:5PkVcelB OS上で動かすアプリ作りたくなったからC++とC#で悩んだんだけどどちらの長所も捨てがたい気がして両方学んでみるかな?って思ったんだけどC++でのおすすめの参考書とかあります?
一応、学生時代にC言語で五目並べとファイルの出力までは勉強してます。
一応ググって入門参考書とか調べましたがちょっとC言語齧ったのなら実戦的な例題集みたいなのが良いのでしょうか?
あとこの質問スレ違いだったらすいません。
一応、学生時代にC言語で五目並べとファイルの出力までは勉強してます。
一応ググって入門参考書とか調べましたがちょっとC言語齧ったのなら実戦的な例題集みたいなのが良いのでしょうか?
あとこの質問スレ違いだったらすいません。
838デフォルトの名無しさん
2024/05/17(金) 09:33:44.70ID:7hVV19/y Windows上のアプリをC++で作るのは少々ハードル高いが
個人的にオススメなのはWindows2000 プログラミング標準講座(ハーバート・シルト著)ってやつ
C++そのものの本は他の人が挙げてくれると思う
個人的にオススメなのはWindows2000 プログラミング標準講座(ハーバート・シルト著)ってやつ
C++そのものの本は他の人が挙げてくれると思う
839はちみつ餃子 ◆8X2XSCHEME
2024/05/19(日) 01:34:46.93ID:lh74nkjR どういう学び方が良いかは人による。
C++ の設計思想としては理解できた便利機能をその都度に導入する形で学んでいけるようにという配慮はしていると設計者は言っている。 実務でプログラミングをしてる人は「C++ をちゃんと習得するまで待ってくれ。 仕事を止めてくれ」とは言えないからね。 C を理解しているならとりあえず C のように書きながら部分的に C++ 的にしていける。
つまり実戦的な学びかたも一応はアリ。
ただ、実戦的な学習はやりたいことが出来てるならそれ以上深掘りする意欲につながらない。
C の書き方でやれるなら別の形に積極的に書き直したい理由って何?と感じてしまうことがある。
きちんとした理解に至らぬままの中途半端な形になりがち。
やりたいこと (書きたいもの) が明白なほうが道筋は付けやすいんだけど、やりたいことに邁進しすぎてもそれはそれで「学習」としてはイマイチなんだよ。
そのへんは程度問題というか匙加減というか、人による、場合によるとしか言いようがない。
個人的にはしっかりとした理屈っぽい入門書を一冊は読んでから方針を決めればいいと思ってる。
C++ の設計思想としては理解できた便利機能をその都度に導入する形で学んでいけるようにという配慮はしていると設計者は言っている。 実務でプログラミングをしてる人は「C++ をちゃんと習得するまで待ってくれ。 仕事を止めてくれ」とは言えないからね。 C を理解しているならとりあえず C のように書きながら部分的に C++ 的にしていける。
つまり実戦的な学びかたも一応はアリ。
ただ、実戦的な学習はやりたいことが出来てるならそれ以上深掘りする意欲につながらない。
C の書き方でやれるなら別の形に積極的に書き直したい理由って何?と感じてしまうことがある。
きちんとした理解に至らぬままの中途半端な形になりがち。
やりたいこと (書きたいもの) が明白なほうが道筋は付けやすいんだけど、やりたいことに邁進しすぎてもそれはそれで「学習」としてはイマイチなんだよ。
そのへんは程度問題というか匙加減というか、人による、場合によるとしか言いようがない。
個人的にはしっかりとした理屈っぽい入門書を一冊は読んでから方針を決めればいいと思ってる。
840デフォルトの名無しさん
2024/05/19(日) 14:09:52.90ID:y+g7UiM3 >>838
レス、ありがとうございます
Windows2000 プログラミング標準講座が近所の図書館にもなかったのでそこにある蔵書読んでみてVisual studio使ったプログラミングしたことないからそれをツールとして使った入門書でいいかな?って思ってしまいました。
>>839
レス、ありがとうございま。。
何を作りたいかの方向性でそれに使うものだけ勉強すれば速いというのはわかります。
自分的には作りたいアプリもあるけどまずGUIアプリを作るための基礎からやりたいなと思ってます。
理屈っぽい入門書の理屈っていう部分はプログラムのハードでの処理の考えとかかと思ったのですがそれはたぶん理工系の学部行ってたので通信情報の基礎理論は聞いたことあるので大丈夫だと思います。
C++は基礎わかってれば後は組み込みたい機能のコードを探せばいいってことと解釈してコード集みたいな辞典を使ったり、ネットで調べたりすればいいってことでいいのでしょうか?
レス、ありがとうございます
Windows2000 プログラミング標準講座が近所の図書館にもなかったのでそこにある蔵書読んでみてVisual studio使ったプログラミングしたことないからそれをツールとして使った入門書でいいかな?って思ってしまいました。
>>839
レス、ありがとうございま。。
何を作りたいかの方向性でそれに使うものだけ勉強すれば速いというのはわかります。
自分的には作りたいアプリもあるけどまずGUIアプリを作るための基礎からやりたいなと思ってます。
理屈っぽい入門書の理屈っていう部分はプログラムのハードでの処理の考えとかかと思ったのですがそれはたぶん理工系の学部行ってたので通信情報の基礎理論は聞いたことあるので大丈夫だと思います。
C++は基礎わかってれば後は組み込みたい機能のコードを探せばいいってことと解釈してコード集みたいな辞典を使ったり、ネットで調べたりすればいいってことでいいのでしょうか?
841はちみつ餃子 ◆8X2XSCHEME
2024/05/19(日) 15:08:47.80ID:lh74nkjR >>840
私がいう「理屈」は言語仕様のことのつもりで言ってた。
低レイヤから入った C ユーザーは C を使えているようでも言語仕様に対する理解が浅くなりがちで、
良くも悪くも機械語 (ハードウェアの挙動) と対応づけて考えてしまうところがある。
言語としての抽象とその実装は分けて考えないといけない。
現代的なコンパイラは最適化がメチャクソに賢いので実際に生成される機械語と一対一には対応づかないし、
言語仕様で未定義としているところを踏んだらわけのわからない動作を引き起こすので
言語仕様について一定以上には身に付けてから実践を始めないと何がなんだかわからないことだらけだと思う。
逆に一定以上に C++ の基礎を身に付けてからならあとはリファレンスを見ながらでも行けるけれど、
今の C++ の「基礎」は昔の C++ と比べるとかなり巨大になってしまっているので当初の C++ の設計思想のように
C から段階的に C++ を身に付けるってのはあまりお勧めできないと私は考えてる。
C++ はとにもかくにも巨大で言語機能はお互いに絡み合っているので部分ごとの理解なんて出来ないんじゃないかということ。
繰り返すけど、人による。
自分なりにどういう方向性で行ったらいいのか判断するためにはどこからでもいいから一旦は始めたらいい。
どうせまったく躓きなく進むなんて出来ないんだから駄目だったときにどこが駄目だったかを検討して
軌道修正するしかしょうがないんじゃないのかな。
私がいう「理屈」は言語仕様のことのつもりで言ってた。
低レイヤから入った C ユーザーは C を使えているようでも言語仕様に対する理解が浅くなりがちで、
良くも悪くも機械語 (ハードウェアの挙動) と対応づけて考えてしまうところがある。
言語としての抽象とその実装は分けて考えないといけない。
現代的なコンパイラは最適化がメチャクソに賢いので実際に生成される機械語と一対一には対応づかないし、
言語仕様で未定義としているところを踏んだらわけのわからない動作を引き起こすので
言語仕様について一定以上には身に付けてから実践を始めないと何がなんだかわからないことだらけだと思う。
逆に一定以上に C++ の基礎を身に付けてからならあとはリファレンスを見ながらでも行けるけれど、
今の C++ の「基礎」は昔の C++ と比べるとかなり巨大になってしまっているので当初の C++ の設計思想のように
C から段階的に C++ を身に付けるってのはあまりお勧めできないと私は考えてる。
C++ はとにもかくにも巨大で言語機能はお互いに絡み合っているので部分ごとの理解なんて出来ないんじゃないかということ。
繰り返すけど、人による。
自分なりにどういう方向性で行ったらいいのか判断するためにはどこからでもいいから一旦は始めたらいい。
どうせまったく躓きなく進むなんて出来ないんだから駄目だったときにどこが駄目だったかを検討して
軌道修正するしかしょうがないんじゃないのかな。
842デフォルトの名無しさん
2024/05/19(日) 15:25:20.86ID:TV8v+5zc843デフォルトの名無しさん
2024/05/19(日) 19:24:07.63ID:y+g7UiM3844はちみつ餃子 ◆8X2XSCHEME
2024/05/19(日) 20:21:36.73ID:lh74nkjR >>843
C++ の仕様は不変なわけではなくてたまに改定してるというのは考慮に入れる必要がある。
どの仕様かを言うときには改定年度を付けて表す通例があって、現時点では C++98, C++03, C++11, C++14, C++17, C++20, C++23 がある。
入門レベルなら最新を積極的に追うほどの必要はないけど、最低限度は C++11 だと思う。
改定の期間があいたせいでインパクトの大きい変化があった。
それより古い書籍は良書だとしても現状に合わないところは色々とあるかもしれない。
GCC や Clang は特に指定しなければ C++17 モードのようなので現時点の基本は C++17 くらいというのが一般的な認識なんじゃないかな。
C++ の仕様は不変なわけではなくてたまに改定してるというのは考慮に入れる必要がある。
どの仕様かを言うときには改定年度を付けて表す通例があって、現時点では C++98, C++03, C++11, C++14, C++17, C++20, C++23 がある。
入門レベルなら最新を積極的に追うほどの必要はないけど、最低限度は C++11 だと思う。
改定の期間があいたせいでインパクトの大きい変化があった。
それより古い書籍は良書だとしても現状に合わないところは色々とあるかもしれない。
GCC や Clang は特に指定しなければ C++17 モードのようなので現時点の基本は C++17 くらいというのが一般的な認識なんじゃないかな。
845デフォルトの名無しさん
2024/05/19(日) 21:02:45.49ID:TV8v+5zc あーそういや独習書いた人だっけ
独習は定番レベルで評価高い、ある程度Cの知識は前提になるけど読めると思う
C++標準講座は読んだことないのでわからんすまん
独習は定番レベルで評価高い、ある程度Cの知識は前提になるけど読めると思う
C++標準講座は読んだことないのでわからんすまん
8461
2024/05/29(水) 05:15:45.12ID:fgEqna2o なに?プログラムって。むつかしそうだなー
ぜんぜん知らないんだけど、ちょっとやってみたいなー
ってな人も、入れてあげてね。
そういうスレなんだから。
ぜんぜん知らないんだけど、ちょっとやってみたいなー
ってな人も、入れてあげてね。
そういうスレなんだから。
847デフォルトの名無しさん
2024/06/11(火) 02:11:04.90ID:T9Og4Yet 質問です。
独習で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;
}
独習で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;
}
848はちみつ餃子 ◆8X2XSCHEME
2024/06/11(火) 05:44:39.09ID:oZDOZRBo >>847
データの型としては unicode を扱えるようになってるけどコンソールは言語の外の話なので Unicode を扱えるかどうか、使えるにしてもどう切り替えるのかは言語仕様としては決まってない。
Unicode で出力は出来るけどそれを理解して表示できる環境かどうかはわからないということ。
データの型としては unicode を扱えるようになってるけどコンソールは言語の外の話なので Unicode を扱えるかどうか、使えるにしてもどう切り替えるのかは言語仕様としては決まってない。
Unicode で出力は出来るけどそれを理解して表示できる環境かどうかはわからないということ。
849デフォルトの名無しさん
2024/06/11(火) 10:47:36.44ID:GrH0S5VC 実行環境を変える
setlocale()するとか
setlocale()するとか
850デフォルトの名無しさん
2024/06/11(火) 15:21:46.44ID:T9Og4Yet851デフォルトの名無しさん
2024/06/11(火) 16:20:37.40ID:ILw6YbJs 長らくVS触ってなかったんであまり役に立たんかもしれんけど
・Visual Studioでutf-8でソース書く方法
http://tech.hikware.com/article/20171020a.html
・Win32APIをutf-8で使う
https://learn.microsoft.com/ja-jp/windows/apps/design/globalizing/use-utf8-code-page
C++標準ライブラリに関してはロケール設定でいけるんじゃなかったっけ、違ってたらすまん
・Visual Studioでutf-8でソース書く方法
http://tech.hikware.com/article/20171020a.html
・Win32APIをutf-8で使う
https://learn.microsoft.com/ja-jp/windows/apps/design/globalizing/use-utf8-code-page
C++標準ライブラリに関してはロケール設定でいけるんじゃなかったっけ、違ってたらすまん
852デフォルトの名無しさん
2024/06/11(火) 16:33:04.86ID:ILw6YbJs https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-170
下の方にsetlocaleでutf-8指定する方法書いてる
で、ソースコードもロケールもutf-8になってりゃ>>847のコードそのままでutf-8で実行してくれるはずよ
下の方にsetlocaleでutf-8指定する方法書いてる
で、ソースコードもロケールもutf-8になってりゃ>>847のコードそのままでutf-8で実行してくれるはずよ
853デフォルトの名無しさん
2024/06/11(火) 16:50:13.04ID:ILw6YbJs 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にしたいんだったらまた別だけど
すまん、実行時もソースコードもオプションに/utf-8入れるだけだったわ
setlocaleしなくていい
utf-16にしたいんだったらまた別だけど
854はちみつ餃子 ◆8X2XSCHEME
2024/06/11(火) 17:31:31.68ID:kKWOd8Cb >>850
言語仕様には書いていないことだから実行環境 (OS やターミナル) のドキュメントを読んでねってこと。
色々な文字コードをサポートしていることもあるししてないこともある。
切り替えることが出来ることもあれば出来ないこともある。
それとストリームはリダイレクト (接続先の変更) される可能性がある。
やりたいことによっては
標準出力がターミナルに繋がっているときとファイルに繋がっているときを区別しなきゃならないかもしれない。
Unix 系 OS の場合はテキストを表示するのはターミナルで、ターミナルはごく普通のアプリケーションのひとつ。
OS 自体はアプリケーションとターミナルの仲立ちをしてるだけなんだけど……。
Windows の場合は標準のテキスト画面 (コンソール) は Windows に標準的に備わった特別なもの。
その特別なテキスト画面を使ってる間は Windows のドキュメントに書いてある通りにすればいいのだけど
Windows で別のターミナルを使うときはその制御方法の規格が確立してないから
主要なターミナルを判定して場当たり的な処理をしているのが現状。
近年は ConPTY という規格が使われ始めてるけどどんなターミナルもそれをサポートしているってわけではないから
結局は場当たり的に対処すべき対象が一個増えただけって感じ。 (将来的には統一されるといいなぁ……)
更に Windows は C ランタイムサポートが文字コード変換の機能も持っていて接続先を勝手に判定して
変換することがあって、その挙動がかなりわけがわからない。
色々あるけどまとめると「こうすればいい」という簡単な説明が出来ない入り組んだ事情があるって話。
言語仕様には書いていないことだから実行環境 (OS やターミナル) のドキュメントを読んでねってこと。
色々な文字コードをサポートしていることもあるししてないこともある。
切り替えることが出来ることもあれば出来ないこともある。
それとストリームはリダイレクト (接続先の変更) される可能性がある。
やりたいことによっては
標準出力がターミナルに繋がっているときとファイルに繋がっているときを区別しなきゃならないかもしれない。
Unix 系 OS の場合はテキストを表示するのはターミナルで、ターミナルはごく普通のアプリケーションのひとつ。
OS 自体はアプリケーションとターミナルの仲立ちをしてるだけなんだけど……。
Windows の場合は標準のテキスト画面 (コンソール) は Windows に標準的に備わった特別なもの。
その特別なテキスト画面を使ってる間は Windows のドキュメントに書いてある通りにすればいいのだけど
Windows で別のターミナルを使うときはその制御方法の規格が確立してないから
主要なターミナルを判定して場当たり的な処理をしているのが現状。
近年は ConPTY という規格が使われ始めてるけどどんなターミナルもそれをサポートしているってわけではないから
結局は場当たり的に対処すべき対象が一個増えただけって感じ。 (将来的には統一されるといいなぁ……)
更に Windows は C ランタイムサポートが文字コード変換の機能も持っていて接続先を勝手に判定して
変換することがあって、その挙動がかなりわけがわからない。
色々あるけどまとめると「こうすればいい」という簡単な説明が出来ない入り組んだ事情があるって話。
855デフォルトの名無しさん
2024/06/11(火) 22:55:22.54ID:T9Og4Yet すいません。
私の環境ただ単にUTFが使用可能になってなかっただけでした。
私の環境ただ単にUTFが使用可能になってなかっただけでした。
856デフォルトの名無しさん
2024/06/12(水) 16:16:19.83ID:HDPWhZcO termcap/terminfoとか
init.d
inittab
getty
init.d
inittab
getty
857デフォルトの名無しさん
2024/06/13(木) 02:54:21.20ID:PAaiBuyr 人間に匹敵する知能を持った汎用人工知能を開発した研究者に総額100万ドルの賞金を授与するコンテスト「ARC Prize」が開催
858デフォルトの名無しさん
2024/06/15(土) 17:34:41.45ID:kg6WNOQa859はちみつ餃子 ◆8X2XSCHEME
2024/06/15(土) 19:41:12.56ID:g9ixUcaw860858
2024/06/15(土) 21:31:29.30ID:kg6WNOQa 俺のエディタは、EmEditor Professional (64-bit)だ。
だ。だからC++は、C++17だ。
わからなかった。ごめんな。
だ。だからC++は、C++17だ。
わからなかった。ごめんな。
861デフォルトの名無しさん
2024/06/16(日) 00:50:11.77ID:v0fD0nKy C++と文字コードに関してはこの記事が面白かった
https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b
俺もあまり詳しくはないから全部理解できた訳じゃないけど、筆者の人がブチギレまくってるのを感じ取るだけでも面白かった
https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b
俺もあまり詳しくはないから全部理解できた訳じゃないけど、筆者の人がブチギレまくってるのを感じ取るだけでも面白かった
862デフォルトの名無しさん
2024/06/16(日) 23:06:40.05ID:+HL215mo >>857
どうやってチューリングテストするんじゃ……
どうやってチューリングテストするんじゃ……
863デフォルトの名無しさん
2024/06/16(日) 23:21:48.48ID:+HL215mo coutやcinとかなiostream系の入出力手段のうちのワイド文字でないやつは
エスケープ文字('\\'とか)や書式指定文字('%'とか)に依存しないから
つまりたまたまマルチバイト文字の一部が '\\' や '%' に一致してもなんら実害が無いから
Shift JISの入出力が問題を引き起こすことは無いという認識でおk?
エスケープ文字('\\'とか)や書式指定文字('%'とか)に依存しないから
つまりたまたまマルチバイト文字の一部が '\\' や '%' に一致してもなんら実害が無いから
Shift JISの入出力が問題を引き起こすことは無いという認識でおk?
864はちみつ餃子 ◆8X2XSCHEME
2024/06/16(日) 23:45:30.66ID:Crm/SwBu >>863
言語仕様的にはテキストモードでは実行環境の都合で各種の変換を入れても良い。 (入れなくても良い)
実際に Windows では文字コードや改行コードの変換をする。
改行が \r\n であるようなテキストを読んでも内部的には \n であるように扱えたりしてるのを不思議に思ったことない?
変換するということは変換元が想定通りじゃないときには破綻する可能性がある。
Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。
バイナリモードではバイト列そのまま。
Linux だとテキストモードとバイナリモードは区別がない。
言語仕様的にはテキストモードでは実行環境の都合で各種の変換を入れても良い。 (入れなくても良い)
実際に Windows では文字コードや改行コードの変換をする。
改行が \r\n であるようなテキストを読んでも内部的には \n であるように扱えたりしてるのを不思議に思ったことない?
変換するということは変換元が想定通りじゃないときには破綻する可能性がある。
Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。
バイナリモードではバイト列そのまま。
Linux だとテキストモードとバイナリモードは区別がない。
865デフォルトの名無しさん
2024/06/17(月) 00:54:42.78ID:pXzMaPAe >>864
だいたいわかりた、
>実際に Windows では文字コードや改行コードの変換をする。
テキストモードにおける '\n' <--> '\r\n' 変換をやるだけでも、
cout << "アイウエオカキクケコ\nさしすせそ" << endl;
と書かれたうちの '\n' と endl の2箇所だけ正確に変換するためには、
上記1行の中に暗黙に含まれるSI/SOおよび2バイト文字の「区」を表す上位バイトを
「実行時に」解釈する必要がある
つまりランタイムはASCIIのつもりで文字列を解釈しては駄目で、
Shift JISというものを知っている必要があり、これが
>Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。
につながるんだと思う。
だいたいわかりた、
>実際に Windows では文字コードや改行コードの変換をする。
テキストモードにおける '\n' <--> '\r\n' 変換をやるだけでも、
cout << "アイウエオカキクケコ\nさしすせそ" << endl;
と書かれたうちの '\n' と endl の2箇所だけ正確に変換するためには、
上記1行の中に暗黙に含まれるSI/SOおよび2バイト文字の「区」を表す上位バイトを
「実行時に」解釈する必要がある
つまりランタイムはASCIIのつもりで文字列を解釈しては駄目で、
Shift JISというものを知っている必要があり、これが
>Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。
につながるんだと思う。
866デフォルトの名無しさん
2024/06/17(月) 00:57:00.44ID:pXzMaPAe しかし
>実行環境の都合で各種の変換を入れても良い。
と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除く)になる、
>実行環境の都合で各種の変換を入れても良い。
と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除く)になる、
867デフォルトの名無しさん
2024/06/17(月) 01:13:07.47ID:pXzMaPAe いやトチ狂ったスマンヌ、
Shift JISの2バイト文字は上位下位ともコントロールコード('\r' や '\n' を含む)とはバッティングしないから
>>865 の理解はやや的を外していた……orz
テキストモードにおける '\n' <--> '\r\n' 変換は、ランタイムがShift JIS文字列をASCIIとして解釈してそれを行っても何ら問題を生じない。
しかし、であればやっぱ>>863に戻って、実は実害無いのでは……
Shift JISの2バイト文字は上位下位とも数字とかともバッティングしないようになっているし……
透過的でない文字コード変換(>>866)が無い限り、cout して cin して結果が変になるケースが思いつかなsげ……
(正確には char c; cin >> c; で 2バイト文字 "陰" の2バイト目を "A" として受け取ってしまう、系の避けようが無い事故は除く
Shift JISの2バイト文字は上位下位ともコントロールコード('\r' や '\n' を含む)とはバッティングしないから
>>865 の理解はやや的を外していた……orz
テキストモードにおける '\n' <--> '\r\n' 変換は、ランタイムがShift JIS文字列をASCIIとして解釈してそれを行っても何ら問題を生じない。
しかし、であればやっぱ>>863に戻って、実は実害無いのでは……
Shift JISの2バイト文字は上位下位とも数字とかともバッティングしないようになっているし……
透過的でない文字コード変換(>>866)が無い限り、cout して cin して結果が変になるケースが思いつかなsげ……
(正確には char c; cin >> c; で 2バイト文字 "陰" の2バイト目を "A" として受け取ってしまう、系の避けようが無い事故は除く
868デフォルトの名無しさん
2024/06/17(月) 16:31:20.06ID:prlYSpwu wstringがutf-32だったら良いのに
869デフォルトの名無しさん
2024/06/18(火) 11:56:24.49ID:mldi07Wv >>861
その人ブチギレてるフリしてるだけの厨二病だから・・・
その人ブチギレてるフリしてるだけの厨二病だから・・・
870デフォルトの名無しさん
2024/07/17(水) 14:22:34.59ID:UFGYctg0 std::functionって関数の「比較」はできないんでしたっけ?
例えばあるクラスが std::function<..> m_callback みたいなインスタンス変数を持ってて
そこにコールバックを登録できるメソッドがあるとします
registerCallback(std::function<..>& callback) { m_callback = callback; } みたいな
で、registerCallback(func)が呼ばれた後、正しいコールバックが保持されていることをテスト
したいのですが、例えばregisterCallback()の引数に渡したstd::function<..>のオブジェクトと
m_callbackはどうしたら比較できるでしょうか。単純に == ではエラーになる模様です
例えばあるクラスが std::function<..> m_callback みたいなインスタンス変数を持ってて
そこにコールバックを登録できるメソッドがあるとします
registerCallback(std::function<..>& callback) { m_callback = callback; } みたいな
で、registerCallback(func)が呼ばれた後、正しいコールバックが保持されていることをテスト
したいのですが、例えばregisterCallback()の引数に渡したstd::function<..>のオブジェクトと
m_callbackはどうしたら比較できるでしょうか。単純に == ではエラーになる模様です
871はちみつ餃子 ◆8X2XSCHEME
2024/07/17(水) 16:12:07.26ID:rcKIBlXh >>870
メンバ関数テンプレート target を使えば元の関数を取り出せる。
https://wandbox.org/permlink/3sCREueD2sVYMW9t
ただし、取り出すときに元の型を指定する必要がある。
ただの関数ならば簡単なのだけれど、
ラムダ式から直接に入れた場合には適切な型を指定できない。
ラムダ式が生成する値はそれぞれに固有の型を持つので。
一旦 std::function に入れたらあまり取り出さない (取り出す必要がない) 設計が望ましいと思う。
テストのためだけなら大丈夫だと思うけど。
メンバ関数テンプレート target を使えば元の関数を取り出せる。
https://wandbox.org/permlink/3sCREueD2sVYMW9t
ただし、取り出すときに元の型を指定する必要がある。
ただの関数ならば簡単なのだけれど、
ラムダ式から直接に入れた場合には適切な型を指定できない。
ラムダ式が生成する値はそれぞれに固有の型を持つので。
一旦 std::function に入れたらあまり取り出さない (取り出す必要がない) 設計が望ましいと思う。
テストのためだけなら大丈夫だと思うけど。
872デフォルトの名無しさん
2024/07/19(金) 12:25:52.15ID:HkXmecYp functionではなくオーバーロードで生の関数や関数オブジェクト(ラムダ含む)を受け取って、functionと共にアドレス値を保存すればいいのでは
関数オブジェクトの場合はoperator ()のアドレス
関数オブジェクトの場合はoperator ()のアドレス
873デフォルトの名無しさん
2024/07/21(日) 02:13:54.03ID:5YGWxq2c 独習でc++を勉強していて時々プロセッサとかライブラリ関数これなんだろ?になるのですがそういうの調べる辞典的なものってあるのでしょうか?
あるのでしたらおすすめのもの教えてもらえませんか
あるのでしたらおすすめのもの教えてもらえませんか
874デフォルトの名無しさん
2024/07/21(日) 02:27:27.18ID:neWsPxIF 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
プラットフォーム固有のものに関してもそれぞれあるけど
関数名でググったら大抵上の方に出てくるとおも
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
プラットフォーム固有のものに関してもそれぞれあるけど
関数名でググったら大抵上の方に出てくるとおも
875はちみつ餃子 ◆8X2XSCHEME
2024/07/21(日) 08:39:43.55ID:uupG6eva ググって出てくるようなのは誤った記述も多い。
あまり信用しすぎずになるべく複数の情報源を持つのが好ましいと思う。
言語仕様は改訂もあるから資料の日付を見てどの版に対応するのかも意識する必要がある。
>>874 が示すような有志がまとめているサイトはちょっとした企業よりも高いモチベーションがあるのか質は高い。
本当にありがたいサイトなので役に立ったと思ったらちょっとくらいは寄付してあげてね。
あまり信用しすぎずになるべく複数の情報源を持つのが好ましいと思う。
言語仕様は改訂もあるから資料の日付を見てどの版に対応するのかも意識する必要がある。
>>874 が示すような有志がまとめているサイトはちょっとした企業よりも高いモチベーションがあるのか質は高い。
本当にありがたいサイトなので役に立ったと思ったらちょっとくらいは寄付してあげてね。
876デフォルトの名無しさん
2024/07/21(日) 12:22:32.16ID:qC5USrOr Unix環境ならmanは割と手軽で良い
877デフォルトの名無しさん
2024/07/21(日) 15:22:13.51ID:neWsPxIF いや、プラットフォーム固有って言ったのは
Microsoft Learn(旧MSDN)とかApple Developerとかのことやぞ
Microsoft Learn(旧MSDN)とかApple Developerとかのことやぞ
878デフォルトの名無しさん
2024/07/21(日) 16:05:28.79ID:neWsPxIF 安価忘れてた、>>875ね
複数の情報源持つべきとかは同意するけど
プラットフォーム固有のは公式が一番信用できるに決まってる(ただMicrosoftのは機械翻訳になってから日本語版がアレだけど・・・)
複数の情報源持つべきとかは同意するけど
プラットフォーム固有のは公式が一番信用できるに決まってる(ただMicrosoftのは機械翻訳になってから日本語版がアレだけど・・・)
879デフォルトの名無しさん
2024/07/21(日) 19:10:23.03ID:5YGWxq2c880デフォルトの名無しさん
2024/07/21(日) 21:04:50.60ID:D0FAs2Ah cpprefjpはなんかTシャツ作るらしいから記念に買うわ
https://github.com/cpprefjp/site/issues/1296
https://github.com/cpprefjp/site/issues/1296
881デフォルトの名無しさん
2024/07/21(日) 21:06:26.85ID:neWsPxIF 手元に置いておく辞典系の本があっても良いと思うけどちょっとお勧めできるものを知らない・・(C++11より前のものしか買ったことない)
秋葉原とかの技術系の書店で手に取って読んでみるのがベストなんだけどねぇ
秋葉原とかの技術系の書店で手に取って読んでみるのがベストなんだけどねぇ
882デフォルトの名無しさん
2024/07/23(火) 01:20:07.66ID:Rfg4Mjqa >>880
誰得
誰得
883デフォルトの名無しさん
2024/07/25(木) 15:13:06.50ID:kulC2cnH >>882
1万円くらいで転売しようと考えています
1万円くらいで転売しようと考えています
884デフォルトの名無しさん
2024/07/29(月) 05:00:32.70ID:ycfafYuZ885デフォルトの名無しさん
2024/08/01(木) 04:44:09.33ID:ZgmEa4OS unordered_map の extract というのはC++17以降でしか使えないのですか
886デフォルトの名無しさん
2024/08/01(木) 09:34:34.68ID:jWmufzw0887デフォルトの名無しさん
2024/08/02(金) 22:37:31.58ID:8YStqjv0 ここでGoogleTestの質問をしてもよろしいでしょうか?
888デフォルトの名無しさん
2024/08/04(日) 12:54:37.69ID:jHE0rxct 質問なのですが派生と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' で宣言されている) にアクセスできません。
と言われるんだけどなんで?その判定要る??
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' で宣言されている) にアクセスできません。
と言われるんだけどなんで?その判定要る??
889デフォルトの名無しさん
2024/08/04(日) 12:56:00.59ID:jHE0rxct 自己解決しますた
文句が言われているのはBaseのコンストラクタでは無くてデストラクタか……orz
文句が言われているのはBaseのコンストラクタでは無くてデストラクタか……orz
890デフォルトの名無しさん
2024/08/04(日) 14:08:27.06ID:dHG4OJIq 本当に解決したの?
それDerivedがBaseを継承していないよ?
それDerivedがBaseを継承していないよ?
891デフォルトの名無しさん
2024/08/04(日) 15:33:06.74ID:jHE0rxct あっはい
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>に渡される時点で呼び出し済なので
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>に渡される時点で呼び出し済なので
892デフォルトの名無しさん
2024/08/04(日) 15:35:40.71ID:jHE0rxct (3)でコンパイルエラーになるのは辻褄があわなくね?!と思った次第
文句言われたのがBaseのデストラクタだったからだいたい理解すた
(std::shared_ptr<Base>はあくまでBaseしか知らないから、Base::~Base()がpublicでなかったら
呼べないという解釈でエラーにするのは当然な可能性
文句言われたのがBaseのデストラクタだったからだいたい理解すた
(std::shared_ptr<Base>はあくまでBaseしか知らないから、Base::~Base()がpublicでなかったら
呼べないという解釈でエラーにするのは当然な可能性
893デフォルトの名無しさん
2024/08/05(月) 09:26:19.70ID:SHyTm/CM std::unordered_map<std::string, std::unique_ptr<int>> map があった時のmapの管理について
教えてください
この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は
foo = std::move(map["hoge"]); としないといけない?
で、moveしたあとは hogeに対する値は無効になっちゃってますよね。ということは
自分で消さないといけない? map.erase("hoo")とかで
教えてください
この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は
foo = std::move(map["hoge"]); としないといけない?
で、moveしたあとは hogeに対する値は無効になっちゃってますよね。ということは
自分で消さないといけない? map.erase("hoo")とかで
894デフォルトの名無しさん
2024/08/05(月) 12:50:07.44ID:Gb5pye15 >>893
>この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は
>foo = std::move(map["hoge"]); としないといけない?
「値を取り出す」をどういう意味で使っているかによる
単に中身を読むだけならmoveしなくても良い
>この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は
>foo = std::move(map["hoge"]); としないといけない?
「値を取り出す」をどういう意味で使っているかによる
単に中身を読むだけならmoveしなくても良い
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 【インバウンド】中国からの“渡航自粛”…ツアー1000人分の直前キャンセル「キャンセル料は免除してくれ」 ことしいっぱいキャンセルに [1ゲットロボ★]
- 「国民の憤りを引き起こした」中国側“高市首相発言の撤回改めて要求” [どどん★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- 【J SPORTS】FIFA U-17ワールドカップ ★9
- とらせん IPあり
- 巨専】
- こいせん 全レス転載禁止
- 侍ジャパンシリーズ2025「日本vs韓国」その12
- 【ATP】テニス総合実況スレ2025 Part 211【WTA】
- 自民党議員「高市は先人が築き上げた日中関係を壊した。外務省が謝罪に言ってるが自分で責任を取れ」 [834922174]
- 米シンクタンク「アメリカは台湾問題で"あいまい戦略"を取っている。高市早苗はこの方針から逸脱している」 [603416639]
- 【高市早苗】バス会社、中国からのキャンセルで12月で2000万円~3000万円の損失へ [115996789]
- かしこいワンコっていうVtuberの子知ってる?
- カレーライスぐちゃぐちゃに混ぜる奴🤣
- 岡田克也「軽々しく存立危機事態とか言うべきじゃない」高市早苗「台湾で武力攻撃が発生したらどう考えても日本の存立危機事態」 [931948549]
