!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part164
https://mevius.5ch.net/test/read.cgi/tech/1683600652/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C++相談室 part165
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ efda-9b8G)
2023/10/31(火) 07:37:38.52ID:+ZyYyqMO0396青木康善 (ワッチョイ 59d4-ANSA)
2024/08/07(水) 04:36:25.01ID:S6qXQ6lv0 素晴らしいなあみなさん。早すぎる!C plus plusは!
397デフォルトの名無しさん (ワッチョイ 5347-eg/E)
2024/08/07(水) 09:54:05.95ID:+pgWMXtY0 JavaはCの20倍速いを知らん人か
398デフォルトの名無しさん (アウアウエー Sa23-LX2u)
2024/08/07(水) 17:07:58.21ID:RPpAsXPKa399青木康善 (ワッチョイ 0bc8-ANSA)
2024/08/08(木) 00:15:58.93ID:Qfze0mfg0 マジっすか?Cの20倍?しかし、専門学校の先生に、青木!バカもん!プログラミング言語Cが一冊で事足りる、と言われても、高校数学でつまづいて大鬱病になったんで、問題が解けない。。。有隣堂本店さんで、リッチーの本置いているから、いつか買います!
400デフォルトの名無しさん (ワッチョイ 31fe-/5UW)
2024/08/08(木) 04:05:43.03ID:G3QDAupS0 今のANSI対応版は易しくなってると思うけどな。
不安ならアンサーブックとセットで買えば良いベ
不安ならアンサーブックとセットで買えば良いベ
401デフォルトの名無しさん (ブーイモ MM33-DGdp)
2024/08/08(木) 16:07:46.41ID:fgfi2g+JM VMのオーバーヘッドがあるのに20倍って?
あるいは20倍時間が掛かる?
あるいは20倍時間が掛かる?
402青木康善 (ワッチョイ 31e4-ANSA)
2024/08/09(金) 13:02:28.92ID:FZEpuz0a0 いや、プログミング言語は、駿台電子は、国語の倒置法なんです。夜間の一年で、javaからで、二年でCなんです。いや、アンサーブックは、池袋ジュンク堂本店さんには、置いてなかったような。。。。。ありがたいというか、ビックリ。。。。マジか。。。機械語を仕事でプログラミングしていた先生が、喫煙所で、青木、お前、一つのことを本当に深く考えたことがあるか?と質問してくれた恩師なんです。
403デフォルトの名無しさん (ワッチョイ 5384-eg/E)
2024/08/10(土) 12:16:45.89ID:xFKQiXk00 スカイネットの誕生日
404デフォルトの名無しさん (スフッ Sd33-QylA)
2024/08/10(土) 23:52:09.93ID:oQf4NdPPd 御巣鷹山ノボレ
405デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 08:35:54.88ID:yYuYqoCz0 すみません。教えて下さい。
template<class T, class U>void (T& x, const U& y)
{
x=y;
...
}
double ←complex<double> の代入がコンパイルエラーとなるconceptの書き方あるんでしょうか?
complex<double> ← doubleの代入ではエラーが出てほしくないです。
template<class T, class U>void (T& x, const U& y)
{
x=y;
...
}
double ←complex<double> の代入がコンパイルエラーとなるconceptの書き方あるんでしょうか?
complex<double> ← doubleの代入ではエラーが出てほしくないです。
406デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 09:05:25.59ID:yYuYqoCz0 あ、上では関数名fが抜けてましたね.concept使わずとも
template<class T> void f(complex<T>& x, const T& y)とすればいいでしょうけど、
y=xのときはどうかとか、あるいは complex<double>←float の代入はokにしたいとか、
いろいろ考えているとテンプレート関数なのに関数のオーバーロードが増えてしまって面倒だなと思ったものですから。
template<class T> void f(complex<T>& x, const T& y)とすればいいでしょうけど、
y=xのときはどうかとか、あるいは complex<double>←float の代入はokにしたいとか、
いろいろ考えているとテンプレート関数なのに関数のオーバーロードが増えてしまって面倒だなと思ったものですから。
407デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 09:23:02.26ID:yYuYqoCz0 y=xのときは忘れてください。(f(complex<T>& y, const T& x)とすればいいだけ)。どういう状況のためにconceptが必要なのか要点がまとまっていませんね。失礼しました。
408デフォルトの名無しさん (ワッチョイ 7ff0-aWDb)
2024/08/24(土) 09:53:34.49ID:PPcTgFGr0 conceptで無理やりくくるよりか、static_assertのほうが楽そう
template<class T, class U>void f(T& x, const U& y)
{
static_assert(std::is_same<double,T>::value&&std::is_same<complex<T>,U>::value,"絶対にゆるさない!絶対ニダ!!");
x=y;
...
}
template<class T, class U>void f(T& x, const U& y)
{
static_assert(std::is_same<double,T>::value&&std::is_same<complex<T>,U>::value,"絶対にゆるさない!絶対ニダ!!");
x=y;
...
}
409デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 11:11:32.60ID:yYuYqoCz0 && は右辺値参照ではなくてandの意味なんですね。std::is_same<double,T>はdouble型とT型が一致するかどうかを調べるヘルパー変数テンプレート、::value は trueかfalseのいずれかの値をとる定数ですか。static_assertは自分でエラーメッセージを作れるのがいいですね。完全にわかっていないですが、勉強します。ヒントありがとうございました。
410デフォルトの名無しさん (ワッチョイ 1f23-dwWB)
2024/08/24(土) 11:44:22.45ID:6PXbzil00 最近、初心者にいきなり右辺値参照とかテンプレート教える風潮は良くないと思うんだよなぁ・・・論理andとごっちゃになってるやんけ
ともあれis_same自体は構造体で、中にあるvalueは定数値やで
変数テンプレートはis_same_vの方。利便性(::value書くのがめんどい)のために用意されてるだけ
static_assertの第一引数(bool)に条件式を与えてるんだが、間違ってる
static_assert(!(std::is_same<double,T>::value&&std::is_same<complex<T>,U>::value),"絶対にゆるさない!絶対ニダ!!");
ともあれis_same自体は構造体で、中にあるvalueは定数値やで
変数テンプレートはis_same_vの方。利便性(::value書くのがめんどい)のために用意されてるだけ
static_assertの第一引数(bool)に条件式を与えてるんだが、間違ってる
static_assert(!(std::is_same<double,T>::value&&std::is_same<complex<T>,U>::value),"絶対にゆるさない!絶対ニダ!!");
411デフォルトの名無しさん (ワッチョイ 7ff0-aWDb)
2024/08/24(土) 12:20:38.61ID:PPcTgFGr0 !抜けてたわ
スマソ
スマソ
412デフォルトの名無しさん (ワッチョイ 7ff0-aWDb)
2024/08/24(土) 12:40:45.95ID:PPcTgFGr0 // こういう書き方もある
if const_expr ( std::is_same<double,T>::value && std::is_same<complex<T>,U>::value ) {
//許されない処理
static_assert(false,"許さんぞ!!");
}else {
//正常処理
}
if const_expr ( std::is_same<double,T>::value && std::is_same<complex<T>,U>::value ) {
//許されない処理
static_assert(false,"許さんぞ!!");
}else {
//正常処理
}
413デフォルトの名無しさん (ワッチョイ 7ff0-aWDb)
2024/08/24(土) 12:43:11.34ID:PPcTgFGr0 また間違えたw
× const_expr
● constexpr
× const_expr
● constexpr
414デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 14:40:14.03ID:yYuYqoCz0 いろいろとありがとうございます。参考になりました。
template<class T, class U> void f(T& x, U& y)
{
if constexpr ( !(std::is_same<T,double>::value &&
std::is_same<U, std::complex<T>>::value) ) static_assert(false,"ワシャ許さんぞ!!");
y=x;
}
template <class T, class U> void g(T& x, U& y)
{
static_assert( (std::is_same<T,double>::value && std::is_same<U, std::complex<T>>::v
alue),"ワシャ許さんぞ!!" );
y=x;
}
int main()
{
using namespace std;
double x=3.14159265358979;
complex<double> z;
f(x,z);
g(z,x); // 順番変えたり、xをfloatにするとエラー
cout<<z<<endl;
しかし、コンパイル時にifがつかえるんですねえ。凄いな、constexpr
template<class T, class U> void f(T& x, U& y)
{
if constexpr ( !(std::is_same<T,double>::value &&
std::is_same<U, std::complex<T>>::value) ) static_assert(false,"ワシャ許さんぞ!!");
y=x;
}
template <class T, class U> void g(T& x, U& y)
{
static_assert( (std::is_same<T,double>::value && std::is_same<U, std::complex<T>>::v
alue),"ワシャ許さんぞ!!" );
y=x;
}
int main()
{
using namespace std;
double x=3.14159265358979;
complex<double> z;
f(x,z);
g(z,x); // 順番変えたり、xをfloatにするとエラー
cout<<z<<endl;
しかし、コンパイル時にifがつかえるんですねえ。凄いな、constexpr
415デフォルトの名無しさん (ワッチョイ 7f78-/FHh)
2024/08/24(土) 15:09:12.28ID:yYuYqoCz0 std::is_same<T,double>::valueの代わりにstd::same_as<T,double>でも良いみたいですね.
416デフォルトの名無しさん (ワッチョイ 9f63-rdaS)
2024/08/24(土) 16:42:04.52ID:6x2BzwZB0 #ifdef NDEBUG
/*pass*/
#else
class dbg_complex {
std::complex<double> m_complex;
public:
// std::complex<double> のメソッドのうち使うやつ同じシグネチャのメソッドを書き並べ、m_complexに移譲
...
private:
dbg_complex(doble); // 禁止
};
#define complex dbg_compled
#endif
※ 個人の感想です。
/*pass*/
#else
class dbg_complex {
std::complex<double> m_complex;
public:
// std::complex<double> のメソッドのうち使うやつ同じシグネチャのメソッドを書き並べ、m_complexに移譲
...
private:
dbg_complex(doble); // 禁止
};
#define complex dbg_compled
#endif
※ 個人の感想です。
417デフォルトの名無しさん (ワッチョイ 9f63-rdaS)
2024/08/24(土) 16:48:40.66ID:6x2BzwZB0 いちいち移譲せねばならないのはstd::complex<T>の継承が禁止されているためorz
実際デストラクタが十中八九virtualではないし、
>>416の最後の
#define complex dbg_complex
みたいな穴だらけの置換手段が嫌ならもうstd::complex<double> を普段からcomplexdbl という別名にすると決めてまう
すると
#ifdef NDEBUG
using complexdbl = std::complex<double>;
#else
using complexdbl = dbg_complex;
#endif
で済む
実際デストラクタが十中八九virtualではないし、
>>416の最後の
#define complex dbg_complex
みたいな穴だらけの置換手段が嫌ならもうstd::complex<double> を普段からcomplexdbl という別名にすると決めてまう
すると
#ifdef NDEBUG
using complexdbl = std::complex<double>;
#else
using complexdbl = dbg_complex;
#endif
で済む
418デフォルトの名無しさん (ワッチョイ ff67-kHtd)
2024/08/24(土) 18:35:31.16ID:BJpt+Mj00 >>412
これかなり新しめのコンパイラじゃないと動かないので注意
これかなり新しめのコンパイラじゃないと動かないので注意
419デフォルトの名無しさん (ワッチョイ 1f23-dwWB)
2024/08/24(土) 19:16:42.78ID:6PXbzil00 行うべき解放処理が無い上ポリモーフィズムも不要なら、別にデストラクタがvirtualである必要は無いぞ
このケースで継承すべきかどうかはまた別として
このケースで継承すべきかどうかはまた別として
420デフォルトの名無しさん (ワッチョイ 1fbe-3Zrt)
2024/08/24(土) 23:53:59.32ID:4DIR6G6I0 >>412
constexpr if が使える (= C++17以上) なら std::is_same<T, U>::value よりも std::is_same_v<T, U> を使う方がシンプルだと思う
constexpr if が使える (= C++17以上) なら std::is_same<T, U>::value よりも std::is_same_v<T, U> を使う方がシンプルだと思う
421デフォルトの名無しさん (ワッチョイ 02f0-HfY5)
2024/08/25(日) 00:16:13.89ID:LfSHCV3h0 ま、お好きなの使えいいんじゃないんすか~
こちとら例文示しているだけで極めているワケじゃないからぬ
こちとら例文示しているだけで極めているワケじゃないからぬ
422はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 4d32-7Uxd)
2024/08/25(日) 01:15:32.96ID:zZ+WMAII0 >>414
テンプレート型引数に require 節などで制約を付けた場合に制約に合致しなければオーバーロード解決候補から除外されるが、 static_assert や if constexpr での判定は解決が終わってテンプレートが実体化されるときに判定される。
つまり、より優先順位の低い候補に当てはめたいかもしれない場合は static_assert や if constexpr での判定をすべきではない。
状況によって使い分けがある。
それと >>418 が注意しているのは、テンプレートはテンプレート引数に依存しない部分は実体化されなくても検証されるルールだから。
(Two phase name lookup について調べてみて。)
つまり static_assert(false, ほにゃらら) と書いてあったらそのテンプレートが使われるかどうかに関係なく問答無用でエラーとして報告されていた。
新しい仕様では static_assert は実体化のときまで検証しないように挙動が改められたのだが、これは欠陥報告の形で問題提起されて過去の仕様に遡って修正されるので C++11 からこの仕様だったことになった。
新しいコンパイラでは C++11 を指定したときでも新しい挙動になる。
テンプレート型引数に require 節などで制約を付けた場合に制約に合致しなければオーバーロード解決候補から除外されるが、 static_assert や if constexpr での判定は解決が終わってテンプレートが実体化されるときに判定される。
つまり、より優先順位の低い候補に当てはめたいかもしれない場合は static_assert や if constexpr での判定をすべきではない。
状況によって使い分けがある。
それと >>418 が注意しているのは、テンプレートはテンプレート引数に依存しない部分は実体化されなくても検証されるルールだから。
(Two phase name lookup について調べてみて。)
つまり static_assert(false, ほにゃらら) と書いてあったらそのテンプレートが使われるかどうかに関係なく問答無用でエラーとして報告されていた。
新しい仕様では static_assert は実体化のときまで検証しないように挙動が改められたのだが、これは欠陥報告の形で問題提起されて過去の仕様に遡って修正されるので C++11 からこの仕様だったことになった。
新しいコンパイラでは C++11 を指定したときでも新しい挙動になる。
423デフォルトの名無しさん (ワッチョイ 0278-RCJX)
2024/08/25(日) 01:34:45.73ID:GxcwnqZY0 まあ、そんな小難しいこと言われても。C++が嫌われる理由だわ
424デフォルトの名無しさん (ワッチョイ 02f0-HfY5)
2024/08/25(日) 02:05:31.18ID:LfSHCV3h0 実体化ってどっちみちコンパイルするときにエラー発生するんだから結果かわらねぇだろバカがよう
425デフォルトの名無しさん (ワッチョイ c5a7-8JDH)
2024/08/25(日) 06:41:14.01ID:n8ainESh0 static_assert(false, "")は何かしらダミーの値入れて回避してたけど修正されてたんだ、知らんかった
426デフォルトの名無しさん (ワッチョイ 02f0-HfY5)
2024/08/26(月) 00:27:52.82ID:JWWBXqLI0 false効かないバカコンパイラはどうしようもないからどうにもならんか
//requires を使った方法
template<class T, class U>
requires(!(std::is_same_v<double,T>&&std::is_same_v<complex<T>,U>))
void f(T& x, const U& y)
{
x=y;
...
}
//requires を使った方法
template<class T, class U>
requires(!(std::is_same_v<double,T>&&std::is_same_v<complex<T>,U>))
void f(T& x, const U& y)
{
x=y;
...
}
427デフォルトの名無しさん (ワッチョイ 2963-G6Q9)
2024/08/27(火) 07:16:06.25ID:NdPbjHCm0 特定の引数型についてテンプレート展開を阻止したいんなら
特殊化してその中にstatic_assert(false, "*** ERR ***")書いても昔は駄目だったんか恐ろしい……
特殊化してその中にstatic_assert(false, "*** ERR ***")書いても昔は駄目だったんか恐ろしい……
428デフォルトの名無しさん (ワッチョイ 2963-G6Q9)
2024/08/27(火) 07:35:09.57ID:NdPbjHCm0 しかしまあ特殊化してテンプレート引数の型Tについて
態と存在しないメソッドを呼ぶように書いたらその特殊化ケースについて展開を阻止できうる(適当
クラス内でint型定数が欲しかったら古き良き enum { ONE, TWO, THREE } で十分やし
同じことをやる手段を増やせば良いってもんじゃないぞPerlじゃあるまいし……
態と存在しないメソッドを呼ぶように書いたらその特殊化ケースについて展開を阻止できうる(適当
クラス内でint型定数が欲しかったら古き良き enum { ONE, TWO, THREE } で十分やし
同じことをやる手段を増やせば良いってもんじゃないぞPerlじゃあるまいし……
429デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
2024/08/27(火) 14:55:30.59ID:oHcafaf7a perlの面白仕様
430デフォルトの名無しさん (ワッチョイ c5f3-8JDH)
2024/08/27(火) 17:14:33.06ID:K2iTXH930 まぁ普通にSFINAEなり=delete指定なりコンセプトなりでオーバーロード候補から外す方が利用者視点でいえば自然だな
431デフォルトの名無しさん (ワッチョイ 0278-RCJX)
2024/08/27(火) 17:33:30.75ID:K7dNHCWQ0 #include <iostream>
#include <complex>
template <class T> decltype(auto) f(T x)
{
decltype(abs(std::declval<T>())) w;
w=abs(x);
return w;
}
int main()
{
using namespace std;
cout<<f(-1) << endl;
cout<<f(2.f)<< endl;
complex<double> z=complex<double>(1.0,1.0);
cout<<f(z)<<endl;
cin.get();
return 0;
}
いちかばちかでやったら、通りました。abs! Who are you? sizeof演算子と同じくコンパイル時に評価されるんですか? というか、地味だけど declval が凄い。
#include <complex>
template <class T> decltype(auto) f(T x)
{
decltype(abs(std::declval<T>())) w;
w=abs(x);
return w;
}
int main()
{
using namespace std;
cout<<f(-1) << endl;
cout<<f(2.f)<< endl;
complex<double> z=complex<double>(1.0,1.0);
cout<<f(z)<<endl;
cin.get();
return 0;
}
いちかばちかでやったら、通りました。abs! Who are you? sizeof演算子と同じくコンパイル時に評価されるんですか? というか、地味だけど declval が凄い。
432はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 4d32-7Uxd)
2024/08/27(火) 18:27:19.33ID:WfqXHPCU0 >>431
sizeof や decltype のオペランドは評価されないということになってる。
だからその文脈で関数を使う場合でもその関数が定義されている必要はない。 (宣言だけあればよい。)
評価されないけど実体化は起こるのでそのへんの理屈は複雑でよくわからん。
sizeof や decltype のオペランドは評価されないということになってる。
だからその文脈で関数を使う場合でもその関数が定義されている必要はない。 (宣言だけあればよい。)
評価されないけど実体化は起こるのでそのへんの理屈は複雑でよくわからん。
434デフォルトの名無しさん (ワッチョイ 0220-Fpn2)
2024/08/30(金) 05:15:18.21ID:ZIPlhev80 相互参照わっかんねぇ
435デフォルトの名無しさん (ワッチョイ 5f2f-+rLF)
2024/09/02(月) 12:36:59.33ID:bqeYsc0k0 相互参照は必要ない
最近はウェブプログラマのほうが賢くなった
すそ野が広がると質が良くなるらしい
最近はウェブプログラマのほうが賢くなった
すそ野が広がると質が良くなるらしい
436デフォルトの名無しさん (ワッチョイ bf0a-5+wm)
2024/09/02(月) 13:00:06.45ID:Rco2Fp/20 必要ない理由ぐらい言ったら?
437はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e732-CMA8)
2024/09/02(月) 14:42:22.37ID:o+5p2SR60 プログラムの文法要素が相互参照になっている状況という意味?
たとえば前方宣言が必要な場合とか。
それとも (実行時の) データ構造が相互参照ということ?
たとえば循環構造の後始末のやり方がわからんとか。
たとえば前方宣言が必要な場合とか。
それとも (実行時の) データ構造が相互参照ということ?
たとえば循環構造の後始末のやり方がわからんとか。
438デフォルトの名無しさん (ワッチョイ 0701-+rOo)
2024/09/02(月) 19:52:42.06ID:cn5uZ01w0 >>435
その「相互参照」って何?
その「相互参照」って何?
439デフォルトの名無しさん (アウアウエー Sa1f-XN8b)
2024/09/05(木) 00:06:16.92ID:/oUqYYg3a 相互参照も自己参照も一緒
自己参照なんて参照してるのは自己ではない
ホントの意味での自己参照は循環参照
自己参照なんて参照してるのは自己ではない
ホントの意味での自己参照は循環参照
440デフォルトの名無しさん (ワッチョイ 5f00-+rLF)
2024/09/05(木) 18:17:57.29ID:xTcyjaky0 shared_ptrを使いたくなったら設計を見直すべき
441デフォルトの名無しさん (ワッチョイ 277f-jESi)
2024/09/06(金) 07:27:10.33ID:Qb4sTpDj0 >>440
それは無理があるんじゃないのかね。
データ共有とかインターフェイス共有とか本質的に所有者が複数存在するオブジェクトはsharedptr使うべきかと。
設計ではモジュール間の疎結合・インターフェイスの汎用化を重視すべきで、そのためにはデータの共有方法が重要になる。
それは無理があるんじゃないのかね。
データ共有とかインターフェイス共有とか本質的に所有者が複数存在するオブジェクトはsharedptr使うべきかと。
設計ではモジュール間の疎結合・インターフェイスの汎用化を重視すべきで、そのためにはデータの共有方法が重要になる。
442デフォルトの名無しさん (ブーイモ MM7f-5+wm)
2024/09/06(金) 11:54:45.03ID:onD85wsiM443デフォルトの名無しさん (ワッチョイ e7df-UdSI)
2024/09/06(金) 22:35:55.77ID:0hxwMUxG0 recurcive_mutexが欲しくなったら設計を見直したい、なら分かる気もする
444デフォルトの名無しさん (ワッチョイ 0753-60ma)
2024/09/07(土) 11:45:08.02ID:Zy1zUumM0 C++11あたりから「生ポは使うな」みたいな極論で分かった気になってる思い上がった初心者が増えたからなぁ
445デフォルトの名無しさん (ワッチョイ bfac-jESi)
2024/09/07(土) 11:58:09.00ID:UFsx2JaR0 >>444
生ポ使うよりかスマートポインタの参照を使った方がマシだったりするからなぁ。スマートポインタがスタックフレームにあるなら安全だし。
スタック変数専用仮引数とかあればもっと安全になるのになぁ。
仮引数の種類はもっとあっていいと思う。
生ポ使うよりかスマートポインタの参照を使った方がマシだったりするからなぁ。スマートポインタがスタックフレームにあるなら安全だし。
スタック変数専用仮引数とかあればもっと安全になるのになぁ。
仮引数の種類はもっとあっていいと思う。
446デフォルトの名無しさん (ワッチョイ 27ea-60ma)
2024/09/07(土) 16:26:14.57ID:lSV8lU690 >>445
考え方にもよるだろうけど、確保も解放も所有もしない関数でスマポ受け取る必要あるか?
特定の用途で管理されている特定のポインタしか許容しない、という意図ならスマポの参照でもいいだろうけど、汎用性は無いよね
生ポ受け取る場合暗黙のキャストも効かないし
考え方にもよるだろうけど、確保も解放も所有もしない関数でスマポ受け取る必要あるか?
特定の用途で管理されている特定のポインタしか許容しない、という意図ならスマポの参照でもいいだろうけど、汎用性は無いよね
生ポ受け取る場合暗黙のキャストも効かないし
447デフォルトの名無しさん (ワッチョイ 8763-0xUn)
2024/09/07(土) 20:17:38.39ID:Ci+xhqlU0448デフォルトの名無しさん (ワッチョイ 8763-0xUn)
2024/09/07(土) 20:21:44.33ID:Ci+xhqlU0 んまー前方宣言が必須というのは言い杉やったかもしれんorz
TreeNodeみたいなクラスはノード毎にヒープを確保するなんてことはやめて専用のアロケーターを設けて
専用の領域をまとめて確保して、
木全体がいらなくなったら木をトラバースすることなく一気に解放するのが本当やが
その場合m_pLeftやm_pRightにあたるのはポインタではなくて専用の領域(配列)のindexとかにすれば
前方宣言は不要、
TreeNodeみたいなクラスはノード毎にヒープを確保するなんてことはやめて専用のアロケーターを設けて
専用の領域をまとめて確保して、
木全体がいらなくなったら木をトラバースすることなく一気に解放するのが本当やが
その場合m_pLeftやm_pRightにあたるのはポインタではなくて専用の領域(配列)のindexとかにすれば
前方宣言は不要、
449デフォルトの名無しさん (ワッチョイ 27ea-60ma)
2024/09/07(土) 21:38:34.24ID:lSV8lU690450デフォルトの名無しさん (ワッチョイ 069a-KwgP)
2024/09/08(日) 00:33:39.65ID:vgBqrjWA0 shared_ptrの内部的な参照カウンタとかはともかく
保持しているオブジェクト自体はアトミックでもなんでもないでしょ
ってなんか勘違いしてる?
保持しているオブジェクト自体はアトミックでもなんでもないでしょ
ってなんか勘違いしてる?
451デフォルトの名無しさん (ワッチョイ 91ea-IbtD)
2024/09/08(日) 01:27:17.93ID:6Lpw1aoe0 持ってるポインタの指す先のオブジェクトがアトミックになるとか言ってると思ってんの?アホかw
452デフォルトの名無しさん (ワッチョイ b501-I4rH)
2024/09/08(日) 01:32:50.82ID:TMvzCbR60 そこでRustですよ!
453デフォルトの名無しさん (ワッチョイ eaf0-8qrK)
2024/09/08(日) 12:52:42.06ID:Lw7YNDXG0 でたw
布教マソw
布教マソw
454デフォルトの名無しさん (ブーイモ MM0a-bJfQ)
2024/09/10(火) 11:29:59.05ID:v6KS9t6sM >>447
お前の理解はshared_ptrの一面だけだな
ようするにunique_ptrの延長でしか見てない
shared_ptrがどうしても欲しくなるのは
オブジェクトのリリースタイミングが非決定的であるとき
これは一般的にマルチスレッド環境
お前のTreeNodeの例はそれこそ生ポで実装しても対して苦労しないが
例えば動的可変multi producerなqueueの場合確実に安全なqueueの解放タイミングを知るにはリファレンスカウントのような制御が必要となる
当然この場合コピーすれば安全なんて寝ぼけたことにはならない
お前の理解はshared_ptrの一面だけだな
ようするにunique_ptrの延長でしか見てない
shared_ptrがどうしても欲しくなるのは
オブジェクトのリリースタイミングが非決定的であるとき
これは一般的にマルチスレッド環境
お前のTreeNodeの例はそれこそ生ポで実装しても対して苦労しないが
例えば動的可変multi producerなqueueの場合確実に安全なqueueの解放タイミングを知るにはリファレンスカウントのような制御が必要となる
当然この場合コピーすれば安全なんて寝ぼけたことにはならない
455デフォルトの名無しさん (アウアウエー Sa52-t/33)
2024/09/10(火) 13:20:49.36ID:KGjTz1X0a x 対して
456デフォルトの名無しさん (ワッチョイ 8a48-/VPw)
2024/09/10(火) 15:36:50.97ID:+l9ylb2n0 それで自己参照ってのは結局何のことを指して言っていたんだい
457デフォルトの名無しさん (ワッチョイ 8a48-/VPw)
2024/09/10(火) 15:39:03.70ID:+l9ylb2n0 あ、相互参照が先か
>>435>>436の言うところの
>>435>>436の言うところの
458デフォルトの名無しさん (ワッチョイ 1ede-2PHd)
2024/09/11(水) 12:14:54.12ID:n6/LwjNL0 (*this)
↑
自己参照
↑
自己参照
459デフォルトの名無しさん (ワッチョイ 1ede-2PHd)
2024/09/11(水) 12:19:01.05ID:n6/LwjNL0 木のノードはstd::vector<>で確保する
と言われて、だよねってなる人はnewもほとんど必要ない
と言われて、だよねってなる人はnewもほとんど必要ない
460デフォルトの名無しさん (ワッチョイ 1ede-2PHd)
2024/09/11(水) 12:22:29.60ID:n6/LwjNL0 木の巡回は、巡回方向別にアダプタとしてイテレータを用意することが出来る
良くある行きがかり順のイテレータはスタックを使って作る
良くある行きがかり順のイテレータはスタックを使って作る
461デフォルトの名無しさん (ブーイモ MM45-bJfQ)
2024/09/11(水) 15:12:04.16ID:1n/VD1trM でvectorの拡張で破綻すんだろ?
462デフォルトの名無しさん (アウアウエー Sa52-t/33)
2024/09/13(金) 16:29:50.66ID:bblj+c3pa move禁止
463デフォルトの名無しさん (ワッチョイ 5ef4-bJfQ)
2024/09/13(金) 19:59:43.80ID:2C9M8qgO0 move禁止したらvector使えないし
464デフォルトの名無しさん (アウアウエー Sadf-N1Zj)
2024/09/17(火) 12:59:42.12ID:TMGdiCOOa それならオブジェクトを保持するためのオブジェクトと
moveためだけのインデックスを分けるかな
moveためだけのインデックスを分けるかな
465デフォルトの名無しさん (ワッチョイ bf84-GITO)
2024/09/17(火) 16:24:30.60ID:DN+X/Cyr0 何がしたい
あほでしょ
あほでしょ
466447 (ワッチョイ d763-HdVQ)
2024/09/21(土) 20:05:42.93ID:FUSKAHoo0 何やら集中砲火を浴びている>>442 やが
マルチスレッド状況でshared_ptr<T>を超有効活用できる手が一つあったわ;;;
スレッド間の共有オブジェクトをポインタpで保持する際の問題点は、
そのポインタを知っている複数スレッドの間でpが指すオブジェクト*pへのアクセスを悉く排他制御せなばならない点やが
逆にpを知っているスレッドが任意の時刻につき1つだけなら、オブジェクトのアクセスに対して排他の必要が無い
それでいてスレッドへのデータの受け渡しに関してコピーの手間は減らせる
例:
なんちゃらWorkerスレッドオブジェクトをshared_ptr<Worker>のキューで保持しておく
スレッドfooが使うときWorker1をshared_ptr<Worker>としてpopする(←これは排他が要る
スレッドbarが使うときWorker2をshared_ptr<Worker>としてpopする(←これは排他が要る
...
(スレッドfooやbarはWorker1、2をそれぞれ独占的に使用できる) ←重要
...
スレッドfooが使い終わったWorker1をキューにpushする(←これは排他が要る
スレッドbarが使い終わったWorker2をキューにpushする(←これは排他が要る
マルチスレッド状況でshared_ptr<T>を超有効活用できる手が一つあったわ;;;
スレッド間の共有オブジェクトをポインタpで保持する際の問題点は、
そのポインタを知っている複数スレッドの間でpが指すオブジェクト*pへのアクセスを悉く排他制御せなばならない点やが
逆にpを知っているスレッドが任意の時刻につき1つだけなら、オブジェクトのアクセスに対して排他の必要が無い
それでいてスレッドへのデータの受け渡しに関してコピーの手間は減らせる
例:
なんちゃらWorkerスレッドオブジェクトをshared_ptr<Worker>のキューで保持しておく
スレッドfooが使うときWorker1をshared_ptr<Worker>としてpopする(←これは排他が要る
スレッドbarが使うときWorker2をshared_ptr<Worker>としてpopする(←これは排他が要る
...
(スレッドfooやbarはWorker1、2をそれぞれ独占的に使用できる) ←重要
...
スレッドfooが使い終わったWorker1をキューにpushする(←これは排他が要る
スレッドbarが使い終わったWorker2をキューにpushする(←これは排他が要る
467447 (ワッチョイ d763-HdVQ)
2024/09/21(土) 20:13:25.63ID:FUSKAHoo0 ていうか2週間ぐらい前から作っていたやつが今さっき完動すた、
468デフォルトの名無しさん (ワッチョイ d763-HdVQ)
2024/09/21(土) 20:35:47.52ID:FUSKAHoo0 std::vector<TreeNode> nodes;
ならnodesを拡張したとき破綻するかもしれんが(nodeをnodesのindexで管理するならその限りではない
std::vector<std::shared_ptr<TreeNode> > apNodes;
ならapNodesを拡張しても破綻しないYO!(要素の実アドレスは保たれる
ならnodesを拡張したとき破綻するかもしれんが(nodeをnodesのindexで管理するならその限りではない
std::vector<std::shared_ptr<TreeNode> > apNodes;
ならapNodesを拡張しても破綻しないYO!(要素の実アドレスは保たれる
469デフォルトの名無しさん (ワッチョイ e37c-C1Jv)
2024/09/22(日) 08:21:05.99ID:e5FZYjui0 それ何のためのshared_ptrなの?unique_ptrでいいというか横からコピーされないようにそうすべきでは
470デフォルトの名無しさん (ワッチョイ 1e52-VArp)
2024/09/25(水) 13:57:54.93ID:N5yN4IuU0 >>466
>>442 を書いたのおれだけど、なんでおれが集中砲火浴びてることになってんだよ
生ポとか意味不明なこといってる>>447は一見してわかるクソレスだろ
おまえはそれ以上のクソレスにクソコード
でもお前の勝ちだ
クソコードに2週間かけた情熱に免じて親切におしえてやるわ
shared_ptrはpに誰かがアクセスしている可能性がある間は決してdeleteされないことを保証できるのが肝
(pの先の排他ではこれは実現できない)
もちろんこれも正しく使わないと保証できない
よくあるミスは知ったかぶって参照カウントを操作しないようにshared_ptrを参照渡しとかにするやつな
その間に絶対deleteされない保証がないならやってはいけない
>>442 を書いたのおれだけど、なんでおれが集中砲火浴びてることになってんだよ
生ポとか意味不明なこといってる>>447は一見してわかるクソレスだろ
おまえはそれ以上のクソレスにクソコード
でもお前の勝ちだ
クソコードに2週間かけた情熱に免じて親切におしえてやるわ
shared_ptrはpに誰かがアクセスしている可能性がある間は決してdeleteされないことを保証できるのが肝
(pの先の排他ではこれは実現できない)
もちろんこれも正しく使わないと保証できない
よくあるミスは知ったかぶって参照カウントを操作しないようにshared_ptrを参照渡しとかにするやつな
その間に絶対deleteされない保証がないならやってはいけない
471デフォルトの名無しさん (ワッチョイ cb41-LUcV)
2024/09/26(木) 03:21:09.01ID:5BtHXQaO0 あーなるほど、一貫してshared_ptrの実体を渡してればそういう保証も出来るのか
自分の場合自前で排他処理や生存保証作ってたけど確かに大きなメリットだね
(オブジェクト内部の排他は別に必要だとしても)
自分の場合自前で排他処理や生存保証作ってたけど確かに大きなメリットだね
(オブジェクト内部の排他は別に必要だとしても)
472デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/26(木) 10:52:52.31ID:R5lWYvWFa そんなあなたにRust
473デフォルトの名無しさん (ワッチョイ 3224-jZWQ)
2024/09/26(木) 11:26:35.22ID:r0pzUHiv0474デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/26(木) 11:37:49.48ID:R5lWYvWFa もちろんRustをやるにはC++を捨てる覚悟が必要
C++コード(特にテンプレやclass)とは相性最悪
C++コード(特にテンプレやclass)とは相性最悪
475デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/26(木) 11:38:22.04ID:R5lWYvWFa >c++コードと混在できるようになって
Rustについて言うなら
おそらくそんな未来は永久に来ない
Rustについて言うなら
おそらくそんな未来は永久に来ない
476デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/26(木) 11:39:08.38ID:R5lWYvWFa 誤解の無いように言っておくと
(一部機能に限れば今でも混在出来るけど)
基本的にはC++とは相いれない
(一部機能に限れば今でも混在出来るけど)
基本的にはC++とは相いれない
477デフォルトの名無しさん (ワッチョイ 77da-jZWQ)
2024/09/26(木) 18:22:32.63ID:sl+cfKHN0 ならc++にRustの機能が取り込まれるのを待つ。
Rustが大人気になったら、さすがに標準委員の連中も初心者・コーダー向けの"Safe c++"をやる気になるだろ。
Rustが大人気になったら、さすがに標準委員の連中も初心者・コーダー向けの"Safe c++"をやる気になるだろ。
478はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e332-Pvcq)
2024/09/26(木) 18:52:53.17ID:B+Au+yIB0 >>477
もう Rust を使えばよくない……?
もう Rust を使えばよくない……?
479デフォルトの名無しさん (ワッチョイ 77da-jZWQ)
2024/09/26(木) 19:43:24.82ID:sl+cfKHN0480はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e332-Pvcq)
2024/09/26(木) 20:25:47.69ID:B+Au+yIB0 >>165
C++ のコードを Rust から呼び出したりするくらいのことは簡単に出来るよ。
たぶん (Java に対する) Kotlin みたいなこととして思い浮かべているようなことは出来る。
Rust がやってるような安全性の保障を自動では受けられない。
当然だが安全ではない (安全性が検証されていない) C++ のコードが Rust から呼び出すことで安全になったりはしない。
大抵の場合に Rust の都合に合わせてラッパーを書くことになる。
C++ のコードを Rust から呼び出したりするくらいのことは簡単に出来るよ。
たぶん (Java に対する) Kotlin みたいなこととして思い浮かべているようなことは出来る。
Rust がやってるような安全性の保障を自動では受けられない。
当然だが安全ではない (安全性が検証されていない) C++ のコードが Rust から呼び出すことで安全になったりはしない。
大抵の場合に Rust の都合に合わせてラッパーを書くことになる。
481デフォルトの名無しさん (ワッチョイ e39c-jZWQ)
2024/09/27(金) 10:23:27.00ID:n6BA5joS0482デフォルトの名無しさん (ブーイモ MMe3-VArp)
2024/09/27(金) 10:44:00.51ID:02Aq/BhWM cxxとかあるけど個人的には中途半端だから使わない
普通に共有ライブラリにして呼び出す方が素直で汎用的で良い
普通に共有ライブラリにして呼び出す方が素直で汎用的で良い
483デフォルトの名無しさん (ワッチョイ 5e79-w5sm)
2024/09/27(金) 12:33:43.81ID:6/1p1gGO0 スマートポインターを使うように強制できる機能とかなら必要ないなあ
484デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/27(金) 16:51:52.33ID:pgg/4VuRa >>473 のような未来は永遠に来ない
485デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/27(金) 16:54:13.57ID:pgg/4VuRa486デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/27(金) 16:54:31.95ID:pgg/4VuRa >>481
同意
同意
487デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/27(金) 16:54:58.40ID:pgg/4VuRa488デフォルトの名無しさん (ワッチョイ e39c-jZWQ)
2024/09/27(金) 17:14:28.28ID:n6BA5joS0489デフォルトの名無しさん (ワッチョイ 728c-rNKn)
2024/09/27(金) 18:24:18.27ID:dg7IL8lg0 極限のパフォーマンスは別に要らないから安全にしたいという要件なら GC が既に解決しているし
今更生ポインタを禁止したところで C# や Java と同じ方向性のナニカにしかならんじゃろ
今更生ポインタを禁止したところで C# や Java と同じ方向性のナニカにしかならんじゃろ
490デフォルトの名無しさん (ワッチョイ 1e02-VArp)
2024/09/27(金) 18:46:28.46ID:EoeiRCVP0 gcがあったらメモリリークしないなんて幻想未だに信じてるとはね
491デフォルトの名無しさん (ワッチョイ a778-KU+G)
2024/09/27(金) 18:59:34.32ID:RwmUzOsi0 リークの話なの?
492デフォルトの名無しさん (ワッチョイ e39c-jZWQ)
2024/09/27(金) 19:07:06.62ID:n6BA5joS0 >>489
ライブラリとかフレームワークを使う側のコーダーと作る側のライブラリアンは性能要件が全然別。
コーダーに対してライブラリアンが「コーダーのコードに極限のパフォーマンスは別に要らないから安全に「させたい」」というのはあるだろ。
ライブラリとかフレームワークを使う側のコーダーと作る側のライブラリアンは性能要件が全然別。
コーダーに対してライブラリアンが「コーダーのコードに極限のパフォーマンスは別に要らないから安全に「させたい」」というのはあるだろ。
493デフォルトの名無しさん (ワッチョイ cb9e-LUcV)
2024/09/27(金) 23:12:04.55ID:cfj6fT7K0 >>492
それならライブラリ側でメモリ周りを隠蔽するような作り方も出来ると思うけど
ユーザー(コーダー)にはインスタンス使わせるけど内部では参照カウントなりスマポなり使ってるみたいな
それですら問題が起きるようならユーザーがクソ
それならライブラリ側でメモリ周りを隠蔽するような作り方も出来ると思うけど
ユーザー(コーダー)にはインスタンス使わせるけど内部では参照カウントなりスマポなり使ってるみたいな
それですら問題が起きるようならユーザーがクソ
494デフォルトの名無しさん (ワッチョイ e37c-C1Jv)
2024/09/28(土) 10:42:06.28ID:swed/tX60 C++はどんな安全策敷いてもユーザー側がその気になればいくらでもぶち壊せるからね
ライブラリがあんまりそこ頑張っても仕方ない
ライブラリがあんまりそこ頑張っても仕方ない
495デフォルトの名無しさん (アウアウエー Saaa-rNKn)
2024/09/28(土) 12:39:39.83ID:gf2/NL3ha Rustなら壊れないみたいな言い草だな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 【映画】『クレヨンしんちゃん』 中国で公開延期 対日報復、エンタメに波及 [冬月記者★]
- Xのネトウヨは大体高齢独身。40過ぎて独身だと例外なく狂うって本当だったんだなと思う [805596214]
- 生活保護だけど30万円のPCの椅子買おうか迷ってる
- 日経時間外、5万円割れ 垂直落下始まる [402859164]
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- 女の子に生まれ変わったらやりたいこと🍓🍫💄❤ [856698234]
- ウッドデッキで調子こいてたやついたじゃん
