前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1636969758/
探検
C++相談室 part159
レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん
2022/02/19(土) 11:56:42.14ID:kSnJ/KwP947デフォルトの名無しさん
2022/04/12(火) 18:39:03.10ID:FTlcB8DO クラス外側でtemplate実装にしろよとは思うが
template<class T>
inline T Instance;
int main(){
Instance<Hoge>.Execute();
}
template<class T>
inline T Instance;
int main(){
Instance<Hoge>.Execute();
}
948デフォルトの名無しさん
2022/04/12(火) 19:21:11.76ID:72/2frZ9 static ローカル変数が定石じゃないの?
949デフォルトの名無しさん
2022/04/12(火) 20:27:31.77ID:vgUv52EM は?
950デフォルトの名無しさん
2022/04/12(火) 20:30:19.09ID:X1V1J1VK 経験的にはどうせ静的なら変に隠さずグローバル変数の方が使いやすいです
951デフォルトの名無しさん
2022/04/12(火) 21:36:16.25ID:RKLCiqJK ちょっと皆さんの言ってることがよくわからないのですが……
テンプレートにして有効範囲で使用する、グローバルでいつでも呼び出せるようにする
ということでしょうか?
使用を想定しているのは膨大なデータのコンプレックスではなく、外部データ加工用に少量のローカル変数を持たせたクラスなので、実体はひつとで大丈夫だと思います。
その際には、衝突を考えないならば、グローバウに無造作に置いた方が使いやすいよ、ということでしょうか?
テンプレートにして有効範囲で使用する、グローバルでいつでも呼び出せるようにする
ということでしょうか?
使用を想定しているのは膨大なデータのコンプレックスではなく、外部データ加工用に少量のローカル変数を持たせたクラスなので、実体はひつとで大丈夫だと思います。
その際には、衝突を考えないならば、グローバウに無造作に置いた方が使いやすいよ、ということでしょうか?
952デフォルトの名無しさん
2022/04/12(火) 22:13:59.90ID:oNokQpOT 左再帰が無限ループになる理由を教えて
954蟻人間 ◆T6xkBnTXz7B0
2022/04/12(火) 23:31:14.39ID:Dt0TGPDO 積んで解放しないから。
955デフォルトの名無しさん
2022/04/12(火) 23:39:21.85ID:EarvAF13 停止しないから無限ループする
…って酷い理由だな
…って酷い理由だな
956デフォルトの名無しさん
2022/04/13(水) 00:21:12.99ID:bubjF7cO じゃあ停止するかどうかを判定する汎用ルーチンHを作ればいいんだよ。
957947
2022/04/13(水) 01:25:51.41ID:qfz8Xp88958デフォルトの名無しさん
2022/04/13(水) 05:51:58.22ID:8pcHyiAe staticにインスタンス入れるやり方だとマルチスレッドマルチプロセスにした時すぐ破綻するから大き目の定数入れる以外には使ってないな
959デフォルトの名無しさん
2022/04/13(水) 08:11:33.40ID:ZQqXT36F グローバル変数は初期化順序が環境依存になる問題があるから、
呼び出し順序で初期化するインライン関数のstaticローカル変数の方が扱いやすい
という話があったかと思うけど、最近は回避するテクニックできたの?
呼び出し順序で初期化するインライン関数のstaticローカル変数の方が扱いやすい
という話があったかと思うけど、最近は回避するテクニックできたの?
960デフォルトの名無しさん
2022/04/13(水) 09:44:11.11ID:abmOAw0D961デフォルトの名無しさん
2022/04/13(水) 10:25:01.35ID:2DJG1h+b 相談
抽象的なノードクラスがあり、上流ノードから下流ノードが接続され情報を取り出したいとする
この時、接続時に上流ノードの出力タイプと、下流ノードの入力タイプが符合するかどうかを調べたい
今考えている実装方法としてenum型でタイプを列挙しておき、ノードの出力属性としてもたせ
入力に必要な属性を接続時に調べておく方法
シンプルでベストかなとは思うが、タイプが増えていくとその管理がやや大変かと思う
文字列で符合させるやり方も考えたが、例えば"int"と"integer"とかでごちゃごちゃしそう
なにか妙案があればお聞かせ願いたい
抽象的なノードクラスがあり、上流ノードから下流ノードが接続され情報を取り出したいとする
この時、接続時に上流ノードの出力タイプと、下流ノードの入力タイプが符合するかどうかを調べたい
今考えている実装方法としてenum型でタイプを列挙しておき、ノードの出力属性としてもたせ
入力に必要な属性を接続時に調べておく方法
シンプルでベストかなとは思うが、タイプが増えていくとその管理がやや大変かと思う
文字列で符合させるやり方も考えたが、例えば"int"と"integer"とかでごちゃごちゃしそう
なにか妙案があればお聞かせ願いたい
962デフォルトの名無しさん
2022/04/13(水) 10:28:21.90ID:CyvaZh5F 抽象的でわからん
963デフォルトの名無しさん
2022/04/13(水) 10:36:53.86ID:2DJG1h+b すいません、もうちょっと自分で考えて相談点まとめます
964デフォルトの名無しさん
2022/04/13(水) 10:44:17.47ID:zii+x7Ds それぞれのスレッドでは個別だけど スレッド内では唯一のインスタンス
スレッドをまたいでも共通で唯一のインスタンス
あたまがこんらんする
スレッドをまたいでも共通で唯一のインスタンス
あたまがこんらんする
965デフォルトの名無しさん
2022/04/13(水) 12:06:05.65ID:IuPW2iUE >>961
どのみち符号の管理・徹底は必須だから、文字列で符号化し、表とかにまとめてバージョン管理・周知徹底する。
protocol bufferとかでインターフェイス管理すれば少しは楽かね。
protocol buffer以外だとなにがいいかしらん?
どのみち符号の管理・徹底は必須だから、文字列で符号化し、表とかにまとめてバージョン管理・周知徹底する。
protocol bufferとかでインターフェイス管理すれば少しは楽かね。
protocol buffer以外だとなにがいいかしらん?
966デフォルトの名無しさん
2022/04/13(水) 12:12:18.93ID:5KnL277L // A と Bのところだけが異なるfとf2
// うまくこの関数をまとめれませんか?
#include <iostream>
#include <vector>
#include <algorithm>
struct Foo
{
void Func() const
{}
};
void f(const std::vector<Foo>& vf)
{
std::for_each(vf.begin(),vf.end(),
[](auto&& f)
{
f.Func();//A
}
);
}
void f2(const std::vector<Foo*>& vf)
{
std::for_each(vf.begin(),vf.end(),
[](auto&& f)
{
f->Func();//B
}
);
}
int main( int argc, char *argv[] )
{
std::vector<Foo> vf;
std::vector<Foo*> vfp;
f(vf);
f2(vfp);
}
// うまくこの関数をまとめれませんか?
#include <iostream>
#include <vector>
#include <algorithm>
struct Foo
{
void Func() const
{}
};
void f(const std::vector<Foo>& vf)
{
std::for_each(vf.begin(),vf.end(),
[](auto&& f)
{
f.Func();//A
}
);
}
void f2(const std::vector<Foo*>& vf)
{
std::for_each(vf.begin(),vf.end(),
[](auto&& f)
{
f->Func();//B
}
);
}
int main( int argc, char *argv[] )
{
std::vector<Foo> vf;
std::vector<Foo*> vfp;
f(vf);
f2(vfp);
}
967蟻人間 ◆T6xkBnTXz7B0
2022/04/13(水) 12:20:05.74ID:+YltrYoo std::vector<Foo*>
std::vector<Foo>
のインターフェイスに共通部分がない。アキラメロン。
std::vector<Foo>
のインターフェイスに共通部分がない。アキラメロン。
968947
2022/04/13(水) 13:02:01.63ID:sgl3F80B type_traitsで殴ればいけそう
template<class T>
auto& to_reference_if_pointer(T&t){
if constexpr(std::is_pointer_v<T>){
return *t;
}else{
return t;
}
}
to_reference_if_pointer(f).Func();
template<class T>
auto& to_reference_if_pointer(T&t){
if constexpr(std::is_pointer_v<T>){
return *t;
}else{
return t;
}
}
to_reference_if_pointer(f).Func();
969はちみつ餃子 ◆8X2XSCHEME
2022/04/13(水) 13:12:01.75ID:qCcEdGhE970デフォルトの名無しさん
2022/04/13(水) 18:00:26.46ID:m7JtDTD6 >>957
今実機で確認して、インライン化したテンプレートをヘッダーに咥える方法が自分にとって良い事を確認しました!
ありがとうございます。
いちいちスタティック咥えるより良いと思います。
マルチスレッドは使用したことがないのでわかりませんが、なるべき勉強してみたいと思います。
皆さんありがとうございます!
今実機で確認して、インライン化したテンプレートをヘッダーに咥える方法が自分にとって良い事を確認しました!
ありがとうございます。
いちいちスタティック咥えるより良いと思います。
マルチスレッドは使用したことがないのでわかりませんが、なるべき勉強してみたいと思います。
皆さんありがとうございます!
971デフォルトの名無しさん
2022/04/13(水) 18:15:56.73ID:I4ieD//T >>966
std::for_each(vf.begin(),vf.end(),std::mem_fn(&Foo::Func));
または
for (auto &&x : vf) { std::invoke(&Foo::Func, x); }
std::for_each(vf.begin(),vf.end(),std::mem_fn(&Foo::Func));
または
for (auto &&x : vf) { std::invoke(&Foo::Func, x); }
972デフォルトの名無しさん
2022/04/13(水) 18:28:24.44ID:U0E88zpG オマンコハンター チンポマン!
股間の銃を携えて今日もおまんこ狙い撃ち
股間の銃を携えて今日もおまんこ狙い撃ち
973デフォルトの名無しさん
2022/04/13(水) 23:40:49.30ID:grUsXYkY >>971
ラムダが消されてて笑った
ラムダが消されてて笑った
974デフォルトの名無しさん
2022/04/13(水) 23:53:02.59ID:nvVh9cdQ975デフォルトの名無しさん
2022/04/14(木) 07:29:49.75ID:Qd4x1CZh シングルトンは要らない子、とヴァカにしていたが
グローバルなオブジェクトのコンストラの呼び出し順序が翻訳単位を超えた呼び出し順序がまるきり不
定になるというC/C++の仕様を回避するのには有効おと1 mgぐらい考えを新ためた
OSのwrapperを書いて、main()でそれを初期化することにして
グローバルなオブジェクトのコンストラから思わずOSのwrapper経由でログを吐かせようとしたらクラッシュして気づいたから
最初のOSのwrapperの最初の呼び出しでまだ未呼び出しなら初期化したら良い(ビコーン ← まんまシングルトン
main()で初期化することが保証しているから、グローバルなコンストラの中でいきなりスレッドを起こしてそこから
OSのwrapperを呼ぶ、みたいなktgi行為が無い限りこのシングルトンはマルチスレッドの対策が不要
グローバルなオブジェクトのコンストラの呼び出し順序が翻訳単位を超えた呼び出し順序がまるきり不
定になるというC/C++の仕様を回避するのには有効おと1 mgぐらい考えを新ためた
OSのwrapperを書いて、main()でそれを初期化することにして
グローバルなオブジェクトのコンストラから思わずOSのwrapper経由でログを吐かせようとしたらクラッシュして気づいたから
最初のOSのwrapperの最初の呼び出しでまだ未呼び出しなら初期化したら良い(ビコーン ← まんまシングルトン
main()で初期化することが保証しているから、グローバルなコンストラの中でいきなりスレッドを起こしてそこから
OSのwrapperを呼ぶ、みたいなktgi行為が無い限りこのシングルトンはマルチスレッドの対策が不要
976デフォルトの名無しさん
2022/04/14(木) 07:33:43.77ID:Qd4x1CZh 訂正orz、
誤: 最初のOSのwrapperの最初の呼び出しでまだ未呼び出しなら初期化したら良い(ビコーン ← まんまシングルトン
正: 最初のOSのwrapperの最初の呼び出しでまだ未初期化なら初期化したら良い(ビコーン ← まんまシングルトン
誤: 最初のOSのwrapperの最初の呼び出しでまだ未呼び出しなら初期化したら良い(ビコーン ← まんまシングルトン
正: 最初のOSのwrapperの最初の呼び出しでまだ未初期化なら初期化したら良い(ビコーン ← まんまシングルトン
977デフォルトの名無しさん
2022/04/14(木) 08:28:49.07ID:79II+WyL 別にシングルトンじゃなくても単に起動時に初期化して渡せばええやん
978デフォルトの名無しさん
2022/04/14(木) 09:59:18.13ID:wwxSZsaE いや要るでしょシングルトン
何らかのリソースマネージャ作るときとか避けて通れないし
何らかのリソースマネージャ作るときとか避けて通れないし
979デフォルトの名無しさん
2022/04/14(木) 10:35:30.42ID:dlHUY+WK >>977
初期化順序の問題って回避できたっけ?
初期化順序の問題って回避できたっけ?
980デフォルトの名無しさん
2022/04/14(木) 10:40:07.14ID:79II+WyL mainでリソース用意しろという話よ
ライブラリだったら初期化用になんか叩いてもらえ
ライブラリだったら初期化用になんか叩いてもらえ
981デフォルトの名無しさん
2022/04/14(木) 10:47:06.20ID:rsrkTEkU グローバル変数をポインタにしておいてmainでnewとか
friend int main(int, char**); とか?
friend int main(int, char**); とか?
982デフォルトの名無しさん
2022/04/14(木) 10:56:36.07ID:79II+WyL なんでグローバル変数にこだわるんだよ
983デフォルトの名無しさん
2022/04/14(木) 10:58:53.82ID:dlHUY+WK984デフォルトの名無しさん
2022/04/14(木) 15:09:30.09ID:4tVKG4Xu 1個でもグローバルなりがあると
エントリポイントの main よりも前に走るコンストラクタ内部であれこれされる可能性を想定する必要に迫られる と
エントリポイントの main よりも前に走るコンストラクタ内部であれこれされる可能性を想定する必要に迫られる と
985デフォルトの名無しさん
2022/04/15(金) 00:01:53.91ID:he9C7sX7986デフォルトの名無しさん
2022/04/15(金) 00:06:58.93ID:xDiQzMrD mainの実行より前に意味があることしようと思ったらコンパイル時しかなかろうよ
987デフォルトの名無しさん
2022/04/15(金) 00:13:00.39ID:he9C7sX7 >>986の主観の話をしているのではない件について:
988デフォルトの名無しさん
2022/04/15(金) 00:22:10.66ID:xDiQzMrD989デフォルトの名無しさん
2022/04/15(金) 04:08:04.71ID:sm6VHVYM 静的ストレージは実装と心中するプログラム以外マジでやめといたほうがいい
移植性が大幅に低下する
移植性が大幅に低下する
990デフォルトの名無しさん
2022/04/15(金) 04:23:41.78ID:1Y3hD0GJ グローバルやstaticな変数を使用する時は排他制御を必ず行なう
これを厳守していれば使っても大丈夫です
もちろん使わずに済む別の方法がある時は別の方法を取るべきです
これを厳守していれば使っても大丈夫です
もちろん使わずに済む別の方法がある時は別の方法を取るべきです
991デフォルトの名無しさん
2022/04/15(金) 06:36:24.15ID:he9C7sX7 >>988
・任意のユーザーが任意のクラスをグローバル変数として使うことをOSが禁止するわけにはいかない
・クラスのコンストラクタでOS資源を確保することは普通(イベントオブジェクトを確保する等、ハンドルのメンバを有効な値で初期化しようとする
・誰かがグローバル変数のコンストラクタでOSの資源を確保しようとしたら、この場合初期化前のOSのwrapperが呼ばれる
ここまで書かないと>>986がいかにたわごとを言っているかわからないわけ?!
>>990
>グローバルやstaticな変数を使用する時は排他制御を必ず行なう
まあそれはそう。今回排他制御を避けられるのは
>main()で初期化することが保証しているから、グローバルなコンストラの中でいきなりスレッドを起こしてそこから
>OSのwrapperを呼ぶ、みたいなktgi行為が無い限りこのシングルトンはマルチスレッドの対策が不要
というktgi行為が無いことの条件付き。
・任意のユーザーが任意のクラスをグローバル変数として使うことをOSが禁止するわけにはいかない
・クラスのコンストラクタでOS資源を確保することは普通(イベントオブジェクトを確保する等、ハンドルのメンバを有効な値で初期化しようとする
・誰かがグローバル変数のコンストラクタでOSの資源を確保しようとしたら、この場合初期化前のOSのwrapperが呼ばれる
ここまで書かないと>>986がいかにたわごとを言っているかわからないわけ?!
>>990
>グローバルやstaticな変数を使用する時は排他制御を必ず行なう
まあそれはそう。今回排他制御を避けられるのは
>main()で初期化することが保証しているから、グローバルなコンストラの中でいきなりスレッドを起こしてそこから
>OSのwrapperを呼ぶ、みたいなktgi行為が無い限りこのシングルトンはマルチスレッドの対策が不要
というktgi行為が無いことの条件付き。
992デフォルトの名無しさん
2022/04/15(金) 07:35:15.38ID:xDiQzMrD >>991
えっと、つまり、使えるものは使わずにはおれない一族に生まれたということですか?
えっと、つまり、使えるものは使わずにはおれない一族に生まれたということですか?
993デフォルトの名無しさん
2022/04/15(金) 08:15:20.73ID:xhqbcuaF994デフォルトの名無しさん
2022/04/15(金) 08:29:52.88ID:y04/Kx9U 自分で記述するだけならどうとでもなるけど
他人に使ってもらう前提だと
限度はあるにしても色々防護策を講じたくなるのもわかる
他人に使ってもらう前提だと
限度はあるにしても色々防護策を講じたくなるのもわかる
995デフォルトの名無しさん
2022/04/15(金) 08:31:14.00ID:xDiQzMrD モジュールの結合度を評価するのにまず排他がどうとか気にするもんかね?
996デフォルトの名無しさん
2022/04/15(金) 08:40:46.42ID:WMzvufu2 C++相談室 part160
https://mevius.5ch.net/test/read.cgi/tech/1649979572/
https://mevius.5ch.net/test/read.cgi/tech/1649979572/
997デフォルトの名無しさん
2022/04/15(金) 08:43:44.23ID:ZcCJtqdn >>995
それとは独立の問題
並行&並列でも動くことが現代では求められているため
一般的にグローバルやstatic変数の読み書きには排他制御が必ず必要となる
厳密な意味で変数ではなく一度限り初期化される定数のようなものの場合はその初期化が排他制御される保証のみでも大丈夫なだけ
それとは独立の問題
並行&並列でも動くことが現代では求められているため
一般的にグローバルやstatic変数の読み書きには排他制御が必ず必要となる
厳密な意味で変数ではなく一度限り初期化される定数のようなものの場合はその初期化が排他制御される保証のみでも大丈夫なだけ
998デフォルトの名無しさん
2022/04/15(金) 08:44:18.42ID:wykOop5a >>994
シングルトンパターンならコンストラクタをプライベートにするんだから、そもそもグローバル変数として初期化できないんじゃない?
シングルトンパターンならコンストラクタをプライベートにするんだから、そもそもグローバル変数として初期化できないんじゃない?
999デフォルトの名無しさん
2022/04/15(金) 08:44:58.60ID:wykOop5a1000デフォルトの名無しさん
2022/04/15(金) 08:49:06.65ID:xDiQzMrD >>997
グローバル変数批判でまずそれが問題だと思うのはどうかしてるよ
グローバル変数批判でまずそれが問題だと思うのはどうかしてるよ
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 54日 20時間 52分 24秒
新しいスレッドを立ててください。
life time: 54日 20時間 52分 24秒
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★5 [BFU★]
- 【インバウンド】中国からの“渡航自粛”…ツアー1000人分の直前キャンセル「キャンセル料は免除してくれ」 ことしいっぱいキャンセルに [1ゲットロボ★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- 「国民の憤りを引き起こした」中国側“高市首相発言の撤回改めて要求” [どどん★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- 【悲報】SANA、発言撤回拒否 [769931615]
- カルピスみたいに水で薄めるジュースでおすすめ他にない?
- 米シンクタンク「アメリカは台湾問題で"あいまい戦略"を取っている。高市早苗はこの方針から逸脱している」 [603416639]
- 岡田克也「軽々しく存立危機事態とか言うべきじゃない」高市早苗「台湾で武力攻撃が発生したらどう考えても日本の存立危機事態」 [931948549]
- ジャーナリストがテレビで解説「台湾問題は高市総理から言ったのではなく、立憲民主が日本の対応可能能力を暴こうとしたから」 [359572271]
- 俺性格悪いなって思った瞬間あげてけ
