C++相談室 part163

■ このスレッドは過去ログ倉庫に格納されています
2022/12/30(金) 23:16:31.37ID:DPUEZfMS0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part162
https://mevius.5ch.net/test/read.cgi/tech/1667194175/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/01/20(金) 18:21:31.76ID:FDJF8fJ70
それはそう。
2023/01/20(金) 18:22:22.62ID:FDJF8fJ70
C++ に欠点が多いのなんてイマサラな話だろ。
2023/01/20(金) 18:29:58.45ID:MjTZXIi3d
はちみつも欠点が多い
2023/01/20(金) 19:33:42.78ID:/4tVg7x40
要らないなぁ。

>>176
c++ならコンストラクタを定義するのが定石じゃない?
使い捨ての構造体ならtupleだし。
2023/01/20(金) 20:55:20.44ID:HgRp3cSY0
再初期化ってのがまず無いかな
2023/01/20(金) 21:12:53.47ID:bX3yX62I0
代入なら普通にあるね
2023/01/20(金) 21:59:52.24ID:vRsHomcy0
>>164
単に名前付きタプルが欲しくてもない、というか名前付きタプルは限りなく構造体に近いというだけですよ
新しいものに飛びつく前に K&R2 以来の伝統の重みを評価するべきでしょう、型推論を併用すれば記述量も抑えることができますよ
https://marycore.jp/prog/cpp/anonymous-struct-tuple/
2023/01/20(金) 22:14:16.78ID:bK8iHZlj0
>>183
で、初期化じゃなくて代入はできるの?
2023/01/21(土) 00:47:37.77ID:SJ/UeQbF0
>>176
どう書きたいのかいまいち分からん
2023/01/21(土) 10:30:12.76ID:PxhUXXTz0
>>184
今は >>159 の「複数の引数を返したい」要望に応える手段の話でしょ?
勝手に話題を広げないでね (^^)
2023/01/21(土) 10:33:35.82ID:ITn943ohd
tieって答え出てるのに気がついてないのかね
2023/01/21(土) 12:44:01.44ID:p4hNMN+0d
使いにくすぎて使われない
2023/01/21(土) 13:11:10.71ID:Wi64nLVza
>>186
元々の話は>>147
2023/01/21(土) 14:45:55.24ID:4IvYDHHD0
HOGE構造体インスタンス hogeのメンバfooとbarだけを再設定したい時に、hogeというインスタンス文字列を何度も書かずに済むような仕組みあればいいなあ
HOGE hoge = {0};
do_something(hoge);
hoge.[foo, bar] = [1, 2];
2023/01/21(土) 15:22:29.46ID:G9LOOV8U0
そういうメソッドを用意するんだよ
2023/01/21(土) 15:42:11.09ID:jQCz8FAl0
ClassName::enumElementという書き方で列挙体の要素を直接持ってこれるクラスを見かけたんですが
どうやってやってるんですか?
定義見てもよくわかりませんでした
2023/01/21(土) 15:48:28.56ID:AnImjWZM0
>>192
enum class と enum が別物だってのは知ってる?
2023/01/21(土) 15:51:00.78ID:5FsD11Dw0
よくわからんがこれのことならenumは外のスコープに漏洩するから出来る
嫌ならenum classにする

class Foo{

public:

 enum{HOGE, FUGA,};

};


int main(){

 std::cout << Foo::HOGE;
}
2023/01/21(土) 15:52:32.72ID:SJ/UeQbF0
>>192
何を書いているのかいまいち分からん
struct ClassName {
enum {
enumElement
};
};
int main () {
std::cout << ClassName::enumElement << '\n';
return 0;
}
2023/01/21(土) 20:19:12.82ID:jQCz8FAl0
説明がへたくそですみません
ClassName::EnumName::elementと書かないといけないところを、
途中のEnumNameを省略して使えるようになってます

>>193
普通のenumでした
2023/01/21(土) 20:30:34.45ID:2W6/mmpkM
普通のenumならEnumName::つかないよ
トップレベルに置いたenumもEnumName::つかないでしょ
2023/01/21(土) 20:43:48.05ID:AnImjWZM0
>>196
だとしたら enum の列挙子のスコープはその列挙型のスコープと同じになるってだけ。
C のコードを持ってきて C++ でエラーにならないように配慮したんだと思う。
2023/01/21(土) 20:44:29.11ID:AnImjWZM0
>>198
C の列挙子は C++ と違ってファイルスコープなので C で仕様に適合するものが C++ ではそうなない場合もあるけど……。
たとえばこういうのは C では通るが C++ ではエラー。

#include <stdio.h>

int main(void) {
struct foo { enum bar { baz } qux; };
int n = baz;
printf("%d\n", n);
}
2023/01/21(土) 22:18:57.09ID:SJ/UeQbF0
>>196
enumとenum classの違いは分かってるんだよね?

#include <iostream>
using namespace std;
struct ClassName {
enum enumElement {element};
enum class enumclassElement {element};
};
int main () {
cout << ClassName::element << '\n'
<< static_cast <int> (ClassName::enumclassElement::element) << '\n';
return 0;
}
2023/01/21(土) 22:54:59.54ID:jQCz8FAl0
ああなるほど、何もしなくてもC形式のenumなら列挙名省略できるんですね
危険といわれている理由が分かりました

>>200
理解できてなかった😭
2023/01/22(日) 17:51:51.29ID:mu8Nl5mu0
pythonのdecimalで2^256倍精度浮動小数点数の最大値を計算してみた。
https://ideone.com/aCP13Y

mpmathで検算もした。(桁数と先頭から千桁程度まで)

これらはC++だとどういうプログラムになるの?
メモリの容量から全桁の出力や検算は無理だと分かるが、できれば検算して戴きたい。
2023/01/22(日) 18:33:56.85ID:vg7X6MkGM
IEEE 754で規格化されてる
2023/01/22(日) 18:53:45.43ID:mu8Nl5mu0
>>203
IEEE754準拠での値で計算してみた。
pythonのdecimalのlogでも検算したので多分合っていると思うが、
C++のプログラムだとどのように計算するのかな?という素朴な疑問です。
ideoneのc++だけでできる?
GMPあたりの任意精度パッケージとか必要になるのかな?
205デフォルトの名無しさん (ワッチョイ 4376-gzmJ)
垢版 |
2023/01/22(日) 19:56:25.38ID:6lZDc9UV0
C++標準ライブラリにはないから外部ライブラリに頼ることになる

ideoneがそれ用のライブラリを持ってるか知らんから頑張って探すしかない
2023/01/22(日) 20:32:22.10ID:9f7YJXTs0
>>204
Boost Multiprecision Libraryあたりからお手軽かね。
他にあったっけ?
2023/01/22(日) 20:43:06.21ID:mu8Nl5mu0
参考にします。どうもありがとう。
2023/01/23(月) 02:24:27.76ID:6OKqnjyz0
C++って最初のバージョンはC言語で開発されましたか?
どこかその話のソースありませんか?
2023/01/23(月) 07:10:57.25ID:HN6zkKZyd
cfrontはC++をCに翻訳するトランスレータ
というのはソースにならんか?
2023/01/23(月) 08:01:54.02ID:eLWdsBBpM
>>208
「C++の設計と進化」を読め。
2023/01/23(月) 08:27:15.10ID:ntFDJsM90
C言語がC++から派生したというのは本当の話ですか?
2023/01/23(月) 09:40:42.62ID:K1n6gQar0
>>211
あなたがウソである証拠を示せばいいだけ。他者に証拠を求めてはいけない。
2023/01/23(月) 10:00:24.86ID:6gVuxkoXF
polymorphic_allocatorなんでコピーでresource伝播してくれないんだ・・・
2023/01/23(月) 13:17:00.05ID:WcsuDU3H0
>>211
C が始まったとき (1972 年) に C++ は無い。
C++ の前身である C with Classes の歴史の始まりは 1979 年で、そのときは
C のプリプロセッサとして書かれていたしあくまでも C の拡張と見なされていた。

後に C は C++ からかなり多くを取り入れることになるし
現在進行形で取り入れてもいるが、それを「派生」とは普通は呼ばない。

普通は呼ばないがそこらへんは言葉の定義の問題なので「派生」という言葉の
定義によっては無理すれば派生と呼べなくもないかもね。
2023/01/23(月) 14:21:27.16ID:6OKqnjyz0
>>209
>>210
CFrontなんてあったのですか
ヒントをありがとうございますた
2023/01/26(木) 06:18:10.77ID:nnR+UHRw0
名前付き引数標準化への動向って今どうなん
標準化はしないから各自勝手にやってねって感じ?
2023/01/26(木) 07:48:33.46ID:XZjGtAvJ0
class A{
public:
 void operator () () {...}
};

class B : public A{
 void func(){
  ここでオペレータ()を呼びたいとき、(*this)()としたら呼べますが、this→()では呼べませんでした。
  なぜでしょうか?
 }
};
2023/01/26(木) 08:02:56.89ID:HqVXg6xF6
>>217
オペレータが左右にとるのは引数でthis->だけだと型が違うから?
2023/01/26(木) 08:03:37.78ID:fdXxt+2fM
>>217
メソッド名でないから。

確認していないけど this->operator()() かと。
2023/01/26(木) 09:02:29.12ID:UDXsjb/60
メソッド
2023/01/26(木) 11:28:53.15ID:Y60o/Mze0
× メソッド
〇 メンバ関数
2023/01/26(木) 11:34:13.17ID:EgU8zvdT0
さてはDelphiやってたな
2023/01/26(木) 12:10:18.58ID:2OqTfEEK0
>>219様のやり方でできました皆様ありがとうございます
2023/01/26(木) 12:11:12.58ID:2OqTfEEK0
すみませんもう一個質問させてください。

template<class T> class A{
public:
 void f(){…}
};

template<class T> class B : public A<T>{
public:
 void g(){f();}
};

というコードがあったとき、g 内の f が undeclared identifier だというエラーが出ますよね?
T が不明だからそうなるのだと説明されてるのを見たのですが、T はコンパイル時には確定してるのになぜダメなのでしょうか。
2023/01/26(木) 12:18:25.89ID:epYCai+9d
template<>class A<void>{};
のようにf()のない特殊化をされる
可能性があるってことさ
2023/01/26(木) 12:30:19.94ID:eBsKw41eM
>>224
void g(){A<T>::f();}
かね。理由は知らん。
2023/01/26(木) 13:28:25.80ID:epYCai+9d
SFINAEに使う技
2023/01/26(木) 14:00:57.20ID:+VNq3wn00
>>226
*this→fとするにしてもA<T>::f()とするにしても長いなあと思ってしまいます
しかたがないので、Bはテンプレートじゃなくても良いように設計し直します
2023/01/26(木) 14:08:41.08ID:UQ2YAYq30
this->f で済むだろうに、設計を変えるほどのことなのか。
2023/01/26(木) 14:16:44.11ID:WpjBlsOj0
>>226
それでは>>225のケースでコンパイルできない
void g(){typename f();}
では?
2023/01/26(木) 14:17:00.65ID:WpjBlsOj0
>>226
それでは>>225のケースでコンパイルできない
void g(){typename f();}
では?
232デフォルトの名無しさん (ワッチョイ 4376-YIrE)
垢版 |
2023/01/26(木) 20:20:42.59ID:yE3XErdV0
すでに出てるけどA<T>が何者か確定してないので、
(B<int>とかの具体的な型が決まる時ではなく)テンプレート宣言時にエラーになる。

template<class T> class B : public A<T>{
using A<T>::f;
public:
void g(){f();}
};
のように親クラスA<T>にメンバーfがいることを宣言してやればテンプレート宣言自体は通る。
2023/01/26(木) 22:25:04.25ID:WpjBlsOj0
>>232
>>231
2023/01/26(木) 23:06:43.67ID:RzvFLRxY0
>>226,232も
>>225のケースで通るよな?
2023/01/26(木) 23:24:47.70ID:WpjBlsOj0
>>234
わりっ! 通る
勘違いしておった
2023/01/26(木) 23:24:56.86ID:WpjBlsOj0
>>234
わりっ! 通る
勘違いしておった
2023/01/27(金) 08:40:23.26ID:m0DNDaLC0
テンプレート引数の取得ってどうやるんでしたっけ?

template<int N = 100> class A{
 ...
};

class B : public A<>{
 ここから N (=100) が見えなくて困ってます。
};
2023/01/27(金) 08:43:39.83ID:dyzf+7Sd0
Aの中にstatic const int nankanokosuu = N;とか定義しておく
2023/01/27(金) 08:49:13.97ID:zx6ru0te0
>>237
class B : public A<>{
template <template<int> class T, int N> int func(T<N>*) { return N; }
public:
void test()
{
cout << func(this);
}
};
2023/01/27(金) 10:58:57.46ID:IAqgV/bpM
>>238
templateって結局
template構文書くより
C言語で直で書いた方が
短くて性能も良いパターンが多い
2023/01/27(金) 12:06:29.37ID:RdqQfVtbd
性能やリソースと引き換えに楽をする為のものだから
2023/01/27(金) 12:26:38.33ID:5C1cxDcZM
>>240
std::vectorユーザーが直書きとか不可能だろ。
2023/01/27(金) 12:32:39.32ID:RdqQfVtbd
丸々作る必要なんか無いんだよ
2023/01/27(金) 12:35:25.48ID:RdqQfVtbd
小規模組み込みならそもそもnewやdeleteが使えない環境もある
Cより便利な記述が出来るからC++を使うというだけ
2023/01/27(金) 12:52:45.15ID:jcVBWYEq0
>>240
>>237をC言語で直で書いたらどうなるの?
2023/01/27(金) 13:48:07.44ID:a+0fKe/I0
>>240-241 テンプレートで性能やリソースを引き換えにすることなんか無いだろ。
・・・コンパイラの処理時間やメモリ消費の話ならあると思うけど、そういう話?
247デフォルトの名無しさん (スププ Sd1f-qKKb)
垢版 |
2023/01/27(金) 13:51:05.37ID:mIJqx29Ld
マジレスすると C++ のテンプレで頑張るより
Nim 使った方が楽だし時間の節約になるよ
2023/01/27(金) 14:14:37.74ID:RdqQfVtbd
>>246
組み込みのチープな環境のプログラムを組んで見ればわかるよ
2023/01/27(金) 14:40:15.09ID:7yNCo9mI0
>>240
ヘボなんだね
2023/01/27(金) 14:50:32.81ID:MqPTrKVr0
コードサイズは確かに増えるだろうが、性能は本当に測ったんか?
2023/01/27(金) 16:10:15.39ID:k7iFif1Jd
チープな環境ではコードサイズが増えるのは致命的
2023/01/27(金) 16:17:02.37ID:a+0fKe/I0
>>248
「組み込みのチープな環境」で組んでたことあるけど、心当たり無いよ。
コードサイズだって手書きなりマクロなりでも必要量は同じになるだろうし。
何か例でも挙げてみてもらえる?
2023/01/27(金) 16:29:51.65ID:B8oMym/70
>>246
テンプレート自体が実行性能の足を引っ張るってことはないが
個々の場面でより性能よく書けるはずのときに汎用部品で済ましてしまうってことはあるんじゃない?

そういうときでも個々の箇所をいじるよりは特殊化を足すだけで済むほうが楽だと思うが。
2023/01/27(金) 16:34:12.21ID:k7iFif1Jd
同じ結果になるように書けばそりゃ同じだろう
テンプレートで楽をすればコードは(一般的には)増える

memcpyで済む物が
型別にコードが発生したり

そういう所を気にすると結局楽が出来ない
2023/01/27(金) 16:37:07.22ID:k7iFif1Jd
>>253
全て特殊化したら楽が出来ない
手間が増えるだけ
2023/01/27(金) 16:40:41.26ID:k7iFif1Jd
10種類のテンプレート引数で使うコードは
基本的には10個のバイナリが生成される

10種類手で書けば
当然コードの共通化を(人間が)考える
2023/01/27(金) 17:11:02.52ID:B8oMym/70
>>255
必要なとき、効果があるときというのは当然の前提やが。
早すぎる最適化は諸悪の根源。 雑に書いて動くようになってから必要に応じてチューニングするもんやで。
2023/01/27(金) 17:18:26.40ID:k7iFif1Jd
>>257
リッチな環境前提の発想
初めから考えないといけないチープな環境もある
2023/01/27(金) 17:22:03.06ID:6glVv8Ll0
Embedded C++やってろ
2023/01/27(金) 17:22:16.96ID:7yNCo9mI0
非力なハードで無理目なことをギリ勝負でやるときはアセンブラだろ
2023/01/27(金) 17:22:48.21ID:k7iFif1Jd
実際PC用コードの多くは組み込みでは全く使えず
ほとんどゼロからの開発になる
2023/01/27(金) 17:24:10.47ID:k7iFif1Jd
>>260
もちろん必要ならアセンブラも使うが
CやC++による最適化が先
2023/01/27(金) 17:24:25.29ID:6ZIN/roZ0
そういう環境ってそもそも標準ライブラリ揃ってなかったりしない?このスレで扱う必要ある?
2023/01/27(金) 17:25:27.76ID:k7iFif1Jd
>>263
標準ライブラリのスレではないから
2023/01/27(金) 17:32:21.49ID:k7iFif1Jd
ぬるま湯環境しか知らないはちみつ
もう少し視野を広げた方が良いかと
2023/01/27(金) 17:50:48.85ID:7yNCo9mI0
なんかやたらマウント取りたがるな
2023/01/27(金) 17:55:50.00ID:6ZIN/roZ0
学校でC++03教えてそう(笑)
2023/01/27(金) 18:01:40.26ID:B8oMym/70
ワイは Z80 時代を生きたおじさんやぞ。
いまどきチープな組み込みでも最初からそんなカリカリにチューニングするのはそんなにないやろ。
無いとは言わんけど C++ の利用例としては例外的やわ。
2023/01/27(金) 18:16:51.47ID:tKRPgB5dd
カリカリチューンとぬるま湯コーディング
はちみつの頭の中はどっちかしか存在しないのかよ
2023/01/27(金) 18:24:03.96ID:7yNCo9mI0
人のことを小馬鹿にするだけなやつ出てけよ
プログラム技術の話の邪魔だ
2023/01/27(金) 18:25:43.08ID:ESaqgTdPd
>>249が書いても説得力ゼロ
私は>>240でもないんだけど
2023/01/27(金) 18:28:51.80ID:7yNCo9mI0
は? 俺は技術の話をしている
途中で根拠も挙げずに変なことを言うやつにチクリとやったが
貴様と違いそれだけじゃねえんだよボケ
2023/01/27(金) 18:30:54.17ID:cYktn2Sdd
根拠あるじゃん
2023/01/27(金) 18:31:53.95ID:cYktn2Sdd
おれがいくつか書いた
2023/01/27(金) 18:32:25.20ID:7yNCo9mI0
どこにだよ
しどろもどろな返事だなスカタン
2023/01/27(金) 18:33:01.59ID:cYktn2Sdd
日本語読めない人かな?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況