前スレ
C++相談室 part160
https://mevius.5ch.net/test/read.cgi/tech/1649979572/
探検
C++相談室 part161
■ このスレッドは過去ログ倉庫に格納されています
2022/05/21(土) 21:23:29.59ID:kYXfaM+5
738デフォルトの名無しさん
2022/09/22(木) 17:27:40.84ID:vBAk//C3 >>737
一般的には型システムの健全性と安全性のために
そのような用途では代数的データ型(タグ付き共用体)を用いる
C++ではstd::variantであるがパターンマッチングなどの言語サポートがないため若干扱いにくい
一般的には型システムの健全性と安全性のために
そのような用途では代数的データ型(タグ付き共用体)を用いる
C++ではstd::variantであるがパターンマッチングなどの言語サポートがないため若干扱いにくい
739はちみつ餃子 ◆8X2XSCHEME
2022/09/22(木) 19:28:31.52ID:He0eupRY >>737
実行時の多相は抽象クラスを使うのが基本ということになってる。
その場合で言えば hoge と hage が共通のインターフェイスを持つ (抽象クラスを継承する) ようにクラス設計するのが普通。
まずは抽象クラスを学んでみて。
最初からクラス設計に関与することが出来ない場合 (既存のライブラリなので手を加えられないなど)
に動的に切り替える必要があるなら std::variant や std::any が使えるのだけれど……
使う箇所で元の型にキャストしなおしたり、 std::visit を経由したりで煩雑になりがち。
実行時の多相は抽象クラスを使うのが基本ということになってる。
その場合で言えば hoge と hage が共通のインターフェイスを持つ (抽象クラスを継承する) ようにクラス設計するのが普通。
まずは抽象クラスを学んでみて。
最初からクラス設計に関与することが出来ない場合 (既存のライブラリなので手を加えられないなど)
に動的に切り替える必要があるなら std::variant や std::any が使えるのだけれど……
使う箇所で元の型にキャストしなおしたり、 std::visit を経由したりで煩雑になりがち。
740デフォルトの名無しさん
2022/09/22(木) 21:37:36.04ID:PsWl+Otb anyってstdに入ってるんだ!
741デフォルトの名無しさん
2022/09/22(木) 22:12:16.21ID:PsWl+Otb742はちみつ餃子 ◆8X2XSCHEME
2022/09/22(木) 22:27:10.41ID:He0eupRY >>740
入ったのは C++17 だし、あまり積極的には使わない種類のものだから目立たないよな……
入ったのは C++17 だし、あまり積極的には使わない種類のものだから目立たないよな……
743デフォルトの名無しさん
2022/09/23(金) 00:25:25.16ID:LrToOuio any使えばクソコードは書けるがw
#include <iostream>
#include <any>
using namespace std;
struct hoge {
int value_;
hoge (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
struct hage {
int value_;
hage (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
std::any ret(int arg)
{
if(arg==0)return hoge (arg);
else if(arg==1)return hage (arg);
return std::any ();
}
int main () {
try {
any_cast <hoge> (ret (0)).output (cout) << endl;
any_cast <hage> (ret (1)).output (cout) << endl;
any_cast <hoge> (ret (1)).output (cout) << endl; // An exception will be thrown.
} catch (const std::bad_any_cast &) {
cerr << "std::bad_any_cast\n";
return -1;
}
return 0;
}
#include <iostream>
#include <any>
using namespace std;
struct hoge {
int value_;
hoge (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
struct hage {
int value_;
hage (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
std::any ret(int arg)
{
if(arg==0)return hoge (arg);
else if(arg==1)return hage (arg);
return std::any ();
}
int main () {
try {
any_cast <hoge> (ret (0)).output (cout) << endl;
any_cast <hage> (ret (1)).output (cout) << endl;
any_cast <hoge> (ret (1)).output (cout) << endl; // An exception will be thrown.
} catch (const std::bad_any_cast &) {
cerr << "std::bad_any_cast\n";
return -1;
}
return 0;
}
744デフォルトの名無しさん
2022/09/23(金) 02:10:00.16ID:gD4It3Ab Python や tcl のコードだな
745デフォルトの名無しさん
2022/09/23(金) 02:31:56.65ID:LrToOuio argがコンパイル時に決まってるなら例えば以下の通りにディスパッチ
Loki::Int2Typeって今はC++に入ってるっけ?
#include <iostream>
using namespace std;
namespace Loki {
template <int v>
struct Int2Type {
enum { value = v };
};
}
struct hoge {
int value_;
hoge (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
struct hage {
int value_;
hage (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
hoge ret(Loki::Int2Type <0> p){return hoge (Loki::Int2Type <0>::value);}
hage ret(Loki::Int2Type <1> p){return hage (Loki::Int2Type <1>::value);}
int main () {
ret (Loki::Int2Type <0> ()).output (cout) << endl;
ret (Loki::Int2Type <1> ()).output (cout) << endl;
return 0;
}
Loki::Int2Typeって今はC++に入ってるっけ?
#include <iostream>
using namespace std;
namespace Loki {
template <int v>
struct Int2Type {
enum { value = v };
};
}
struct hoge {
int value_;
hoge (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
struct hage {
int value_;
hage (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
hoge ret(Loki::Int2Type <0> p){return hoge (Loki::Int2Type <0>::value);}
hage ret(Loki::Int2Type <1> p){return hage (Loki::Int2Type <1>::value);}
int main () {
ret (Loki::Int2Type <0> ()).output (cout) << endl;
ret (Loki::Int2Type <1> ()).output (cout) << endl;
return 0;
}
746デフォルトの名無しさん
2022/09/23(金) 17:57:04.27ID:tVlOtcCS747デフォルトの名無しさん
2022/09/23(金) 18:13:00.58ID:MklXD0R7 そういう用途でタグ無しunionは危険で不便な昔の遺物
どの言語でも安全で便利なタグ付きunionを用いる
C++はパターンマッチングが弱いのでそこを改善すればさらに便利になるはずだ
どの言語でも安全で便利なタグ付きunionを用いる
C++はパターンマッチングが弱いのでそこを改善すればさらに便利になるはずだ
748デフォルトの名無しさん
2022/09/23(金) 19:52:56.72ID:Ztvb6Y4W 無名の共用体
anonymous union
anonymous union
749デフォルトの名無しさん
2022/09/23(金) 23:41:53.30ID:icgBEU6J anonymous union というとなにかこう、不穏なひびきがあるな
集団で徒党をくんでハッキングする的な
集団で徒党をくんでハッキングする的な
750デフォルトの名無しさん
2022/09/24(土) 00:05:53.42ID:G+JpnkhJ そもそも文脈なしのunionって労働組合だからもともと不穏な響きの単語
751デフォルトの名無しさん
2022/09/24(土) 00:18:57.85ID:JL9pTOdW ネトウヨ現る
752デフォルトの名無しさん
2022/09/24(土) 00:38:49.83ID:Pnjq2Ki8 Union Jack
753デフォルトの名無しさん
2022/09/24(土) 00:38:55.02ID:NrutJXN/ 「集団」で「徒党」を組むって
754デフォルトの名無しさん
2022/09/24(土) 20:29:13.36ID:7pBAspe1 Visual Studio Community おそろしあ
755デフォルトの名無しさん
2022/09/24(土) 22:05:06.81ID:51wpUqA8 チューリンからメール北?
756デフォルトの名無しさん
2022/09/26(月) 08:57:53.30ID:Fzzl8jy0 >>751
何が見えてるの…
何が見えてるの…
757デフォルトの名無しさん
2022/09/26(月) 21:36:36.83ID:T6INyDl8 ちょっとわからなくなってきたため良ければ教えてください。
他言語を使用していて強く感じることですが、.hと.cppを行ったり来たりする開発スタイルがかなり面倒に感じます。
ヘッダに実装を書いても普通にビルド出来てしまうため個人的な開発はヘッダオンリで済ませています。
何番煎じの話かもしれませんが、分割するしないでのメリット・デメリットを教えてください。
他言語を使用していて強く感じることですが、.hと.cppを行ったり来たりする開発スタイルがかなり面倒に感じます。
ヘッダに実装を書いても普通にビルド出来てしまうため個人的な開発はヘッダオンリで済ませています。
何番煎じの話かもしれませんが、分割するしないでのメリット・デメリットを教えてください。
758デフォルトの名無しさん
2022/09/26(月) 21:41:04.85ID:yuD7kgln 再コンパイルコストとインターフェイスと実装の分離
hに全部書いてしまうと、それの変更があった場合にincludeするすべてのファイルで再コンパイルが走り、時間がかかるようになる
hに全部書くため、変更の機会も当然多くなり、頻繁にビルド待ちの状態になるのは避けたい
インターフェイスと実装を分離しておくことは、保守や共有の最、理解を早くするという点で有用
どっちの話も大規模になると効いてくる話なので、小規模開発なら全部.hに書くスタイルでも構わないとは思う
hに全部書いてしまうと、それの変更があった場合にincludeするすべてのファイルで再コンパイルが走り、時間がかかるようになる
hに全部書くため、変更の機会も当然多くなり、頻繁にビルド待ちの状態になるのは避けたい
インターフェイスと実装を分離しておくことは、保守や共有の最、理解を早くするという点で有用
どっちの話も大規模になると効いてくる話なので、小規模開発なら全部.hに書くスタイルでも構わないとは思う
759はちみつ餃子 ◆8X2XSCHEME
2022/09/27(火) 09:30:59.47ID:ozjafOA0 >>757
C の延長線上でなんとかしてきた C++ の言語仕様があんまり良くないんだよ……。
実装とインターフェイスを分けるのはカプセル化の観点からも好ましいのだけれど
C++ ではテンプレートを処理する都合上でこの分離が破綻しているので
そこらへんはまあ運用の工夫で……みたいな微妙な機微がある。
どうにもならんのがわかってるから新しい C++ ではようやくモジュールが導入された。
C の延長線上でなんとかしてきた C++ の言語仕様があんまり良くないんだよ……。
実装とインターフェイスを分けるのはカプセル化の観点からも好ましいのだけれど
C++ ではテンプレートを処理する都合上でこの分離が破綻しているので
そこらへんはまあ運用の工夫で……みたいな微妙な機微がある。
どうにもならんのがわかってるから新しい C++ ではようやくモジュールが導入された。
760デフォルトの名無しさん
2022/09/27(火) 09:41:59.52ID:ZJUDc1gE FILE * は使っても
struct FILE の中身なんて知らなくて良いからな
使うだけなら void * で充分
struct FILE の中身なんて知らなくて良いからな
使うだけなら void * で充分
761デフォルトの名無しさん
2022/09/27(火) 11:09:05.55ID:HLZr1vWv c#みたいにヘッダ無いのが良いことだとは思えんのだよなあ
762デフォルトの名無しさん
2022/09/27(火) 11:20:16.93ID:XJRFtCjW C#だけでなく今世紀のプログラミング言語は全てヘッダファイルなんて無いんじゃない?
不要なものなんだと思うよ
不要なものなんだと思うよ
763デフォルトの名無しさん
2022/09/27(火) 11:28:04.52ID:dmYM9sG7 .hppって拡張子でヘッダに処理を書いてるのを見たことある
764はちみつ餃子 ◆8X2XSCHEME
2022/09/27(火) 14:13:36.82ID:ozjafOA0 >>763
.hpp は C++ のヘッダとしてはありふれた拡張子。 定義を書くかどうかとは関係なく使われるよ。
昔は .hxx とか .h++ とかもあったし、テンプレートが含まれるヘッダには .tcc と付ける習慣が一部にはあった。
大文字で .H とか付けてるのも有ったけどファイルシステムによっては大文字と小文字が区別されないから早い内に廃れたと思う。
C と共用できるように書かれたヘッダを除いては .h という拡張子は避けたほうが運用しやすいと思うんだが、
そこらへんの考え方も慣例が確立していなくてなんだかグダグダなんだよなぁ。
.hpp は C++ のヘッダとしてはありふれた拡張子。 定義を書くかどうかとは関係なく使われるよ。
昔は .hxx とか .h++ とかもあったし、テンプレートが含まれるヘッダには .tcc と付ける習慣が一部にはあった。
大文字で .H とか付けてるのも有ったけどファイルシステムによっては大文字と小文字が区別されないから早い内に廃れたと思う。
C と共用できるように書かれたヘッダを除いては .h という拡張子は避けたほうが運用しやすいと思うんだが、
そこらへんの考え方も慣例が確立していなくてなんだかグダグダなんだよなぁ。
765デフォルトの名無しさん
2022/09/27(火) 18:54:18.35ID:vGdotfW0 >>763
template主体ならhppにガッツリ書いてたけど、ちな、どこに書くの?
template主体ならhppにガッツリ書いてたけど、ちな、どこに書くの?
766デフォルトの名無しさん
2022/09/27(火) 19:06:22.22ID:c5I+FNto ヘッダはテンプレートでごちゃごちゃしてなければどんな構造してるのかパッと見で分かりやすい
767デフォルトの名無しさん
2022/09/27(火) 19:11:23.36ID:3EQ0ZEAi ヘッダに実装書く必要がある場合は
俺はインターフェース用ヘッダと実装用ヘッダに分けてるな
ヘッダには本来インターフェースのみが簡潔に書かれているのが望ましいと思う
俺はインターフェース用ヘッダと実装用ヘッダに分けてるな
ヘッダには本来インターフェースのみが簡潔に書かれているのが望ましいと思う
768デフォルトの名無しさん
2022/09/27(火) 20:14:12.91ID:eLTt/hKm 他のプログラミング言語はヘッダファイルが無くても困っていないから
ヘッダファイルは大昔当時のCコンパイラがサボるために用意しただけの本来は要らない子なんじゃ?
ヘッダファイルは大昔当時のCコンパイラがサボるために用意しただけの本来は要らない子なんじゃ?
769デフォルトの名無しさん
2022/09/27(火) 20:35:59.29ID:c5I+FNto ソース公開出来ないようなハード実装ライブラリを隠蔽して提供するためにはヘッダは必須項目
770デフォルトの名無しさん
2022/09/27(火) 20:41:17.15ID:WqTtjjk3771デフォルトの名無しさん
2022/09/27(火) 20:49:31.24ID:3EQ0ZEAi772デフォルトの名無しさん
2022/09/27(火) 21:01:15.67ID:uWssz7Bg >>771
時代遅れすぎだろw
今はそんなヘッダファイルを見なくても
ヘッダファイルが存在しなくても
ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
だからC/C++以外はヘッダファイルなんて存在しない
時代遅れすぎだろw
今はそんなヘッダファイルを見なくても
ヘッダファイルが存在しなくても
ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
だからC/C++以外はヘッダファイルなんて存在しない
773デフォルトの名無しさん
2022/09/27(火) 21:05:03.18ID:3EQ0ZEAi >>772
>ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
それはヘッダがないから仕方なくなのではないかな?
C++でも自動抽出ツールされたドキュメントを見ても良いのだよ
>ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
それはヘッダがないから仕方なくなのではないかな?
C++でも自動抽出ツールされたドキュメントを見ても良いのだよ
774デフォルトの名無しさん
2022/09/27(火) 21:08:18.80ID:j15wYqDV >>773
つまりヘッダファイルの必要性はない、との結論になりますな
つまりヘッダファイルの必要性はない、との結論になりますな
775デフォルトの名無しさん
2022/09/27(火) 21:10:16.49ID:3EQ0ZEAi ならない
776はちみつ餃子 ◆8X2XSCHEME
2022/09/27(火) 21:23:27.93ID:ozjafOA0 実装とインターフェイスを分離するという根本思想自体はよかったと思う。
それを実現するためにプリプロセッサで単純にヘッダをはめ込むというのは雑すぎるやり方だとも思う。
それを実現するためにプリプロセッサで単純にヘッダをはめ込むというのは雑すぎるやり方だとも思う。
777デフォルトの名無しさん
2022/09/27(火) 21:36:37.50ID:D5WhN1Dz 他の言語はヘッダ無くても何も困っていないから
本質的にはヘッダは不要物なのだと思われる
本質的にはヘッダは不要物なのだと思われる
778デフォルトの名無しさん
2022/09/27(火) 22:23:04.59ID:vPBo+Ol+ マルチパスコンパイルするオプションがコンパイラにあればいいのにね
779デフォルトの名無しさん
2022/09/27(火) 22:28:17.08ID:TG8VJWwA >>777
古い bcc には、確かヘッダを自動抽出するオプションがあった気がする
古い bcc には、確かヘッダを自動抽出するオプションがあった気がする
780デフォルトの名無しさん
2022/09/27(火) 22:39:41.48ID:EwsxhlHO 仕組みが簡潔でドライなシステムを好む人もいるし
もはや把握しきれないカオスなシステムに帰依する人もいる
俺は前者だし、これからもそうありたい
もはや把握しきれないカオスなシステムに帰依する人もいる
俺は前者だし、これからもそうありたい
781デフォルトの名無しさん
2022/09/27(火) 22:51:33.49ID:c5I+FNto カオスは崩壊へと繋がる
ATiのCatalystのようにな
ATiのCatalystのようにな
782デフォルトの名無しさん
2022/09/27(火) 23:37:44.35ID:3EQ0ZEAi 実装とインターフェイスの分離の点でC++が甘いのは
classのメンバー変数がヘッダに書くところ
俺はデフォルトでpimplにしてるけど
classのメンバー変数がヘッダに書くところ
俺はデフォルトでpimplにしてるけど
783デフォルトの名無しさん
2022/09/27(火) 23:55:22.40ID:TrPk/9km >>780
最近の言語はどれもその簡潔な方式だよ
ヘッダファイルとソースファイルは二重管理だからソースファイルに統一
さらにソース付随コメントとドキュメントファイルも統合してソースファイルにのみ記述
シンプルになってる
最近の言語はどれもその簡潔な方式だよ
ヘッダファイルとソースファイルは二重管理だからソースファイルに統一
さらにソース付随コメントとドキュメントファイルも統合してソースファイルにのみ記述
シンプルになってる
784デフォルトの名無しさん
2022/09/28(水) 00:14:01.17ID:SR5jaMok 自動生成みたいなことしても、特に見通しがよくなっとらんと思うんだよね
ヘッダファイルじゃなくてもいいけど、どこかでユーザにインタフェース提示を強制する必要はある気がする
ヘッダファイルじゃなくてもいいけど、どこかでユーザにインタフェース提示を強制する必要はある気がする
785デフォルトの名無しさん
2022/09/28(水) 00:21:27.19ID:2Lj4foK2786デフォルトの名無しさん
2022/09/28(水) 00:52:38.13ID:qgMCZEH2 いや俺はインターフェースは簡潔にヘッダーにまとまってる方が良い
管理が二重になっている云々は同意せんでもないが
同一性はコンパイラがチェックしてくれるので全く問題なし
ドキュメントの自動生成ってリアルタイムに更新してくれるんかいな?
Doxygenみたいなのを想像してるんだが?
管理が二重になっている云々は同意せんでもないが
同一性はコンパイラがチェックしてくれるので全く問題なし
ドキュメントの自動生成ってリアルタイムに更新してくれるんかいな?
Doxygenみたいなのを想像してるんだが?
787デフォルトの名無しさん
2022/09/28(水) 00:54:10.34ID:qgMCZEH2 C++に慣れすぎて実装とインターフェースが混在してるソース見ると
俺は読みたくなくなるんだが?
俺は読みたくなくなるんだが?
788デフォルトの名無しさん
2022/09/28(水) 00:57:52.51ID:ipyGSCwr789デフォルトの名無しさん
2022/09/28(水) 01:57:05.38ID:wKFGQzb0790はちみつ餃子 ◆8X2XSCHEME
2022/09/28(水) 02:35:16.76ID:koSj9wX0 >>768
ヘッダを分けるのは最初は処理系の実装上の都合だったのは事実だと思う。
素朴なオブジェクトファイルは名前とアドレスの組でしか管理していない。
具体的な型をやりとりする仕組みは必要で、それがヘッダファイル。
リンカなどのツールチェインが充実していないのを
コンパイラとプリプロセッサがカバーする形なのでツールチェイン全体が上手く連携できるなら
ヘッダという仕組みは無くても良い。
それはそれとして処理に必要かどうかと言語の表現はまた別問題だ。
原理的に必要かどうかだけで言うならバイナリエディタだけあればプログラムは作れることになってしまうよ。
言語は機械に処理させる以上に人が読み書きする。
もちろんどんな言語が分かり易いかは人によるだろうけども
C++ に満足している C++ ユーザは実装とインターフェイス分離することを利点だと考えている場合は確実に多いよ。
私もそうだし。
ヘッダを分けるのは最初は処理系の実装上の都合だったのは事実だと思う。
素朴なオブジェクトファイルは名前とアドレスの組でしか管理していない。
具体的な型をやりとりする仕組みは必要で、それがヘッダファイル。
リンカなどのツールチェインが充実していないのを
コンパイラとプリプロセッサがカバーする形なのでツールチェイン全体が上手く連携できるなら
ヘッダという仕組みは無くても良い。
それはそれとして処理に必要かどうかと言語の表現はまた別問題だ。
原理的に必要かどうかだけで言うならバイナリエディタだけあればプログラムは作れることになってしまうよ。
言語は機械に処理させる以上に人が読み書きする。
もちろんどんな言語が分かり易いかは人によるだろうけども
C++ に満足している C++ ユーザは実装とインターフェイス分離することを利点だと考えている場合は確実に多いよ。
私もそうだし。
791デフォルトの名無しさん
2022/09/28(水) 05:55:54.63ID:8U6H9Gn3 単にヘッダファイルに慣れていて愛着があるだけです
冷静に考えれば分かります
他の言語はヘッダファイルがなくても機能しています
つまりヘッダファイルは不要なものです
他の言語はヘッダファイル方式を採用しませんでした
つまりヘッダファイルを採用するに値するアドバンテージはありません
冷静に考えれば分かります
他の言語はヘッダファイルがなくても機能しています
つまりヘッダファイルは不要なものです
他の言語はヘッダファイル方式を採用しませんでした
つまりヘッダファイルを採用するに値するアドバンテージはありません
792デフォルトの名無しさん
2022/09/28(水) 08:10:47.02ID:PNF1OAD8 今は必要に応じてIDLを使うようになっているだけじゃない?Protobufぐらいしか知らないけど。
793デフォルトの名無しさん
2022/09/28(水) 08:51:33.64ID:qgMCZEH2794デフォルトの名無しさん
2022/09/28(水) 09:19:16.30ID:H8fqr1nL c#のプロジェクト、実装してから設計起こした様なグダグダなのばっかになってるよね
pythonだとそうはならん気がするけど
pythonだとそうはならん気がするけど
795デフォルトの名無しさん
2022/09/28(水) 22:49:08.92ID:6+yt9OFm obj や lib だけを提供する場合は、ヘッダは絶対に必要かと
他の言語ではどうしていますか?
他の言語ではどうしていますか?
796デフォルトの名無しさん
2022/09/29(木) 03:41:22.05ID:6tct/z4w ヘッダは無くてもいいがある方が便利なときがある
使い回すマクロの定数とか定義とかヘッダに書くのが一般だし
誰かが書いてたけどヘッダファイルに関数の説明とか書くスタイルなら
そこだけ見れば済むようになるし
無くても困らないけど結局は
include xxx.c なんてソースコードを見ることなると思う
使い回すマクロの定数とか定義とかヘッダに書くのが一般だし
誰かが書いてたけどヘッダファイルに関数の説明とか書くスタイルなら
そこだけ見れば済むようになるし
無くても困らないけど結局は
include xxx.c なんてソースコードを見ることなると思う
797デフォルトの名無しさん
2022/09/29(木) 03:46:51.96ID:6tct/z4w798デフォルトの名無しさん
2022/09/29(木) 04:34:33.18ID:MD5zUQsY ラムダ式でコピーキャプチャした変数ってなんでデフォルトで immutable なの?
あとそれに関連してるかもしれないけど、const int a があったとして、a をコピーキャプチャして mutable をつけたラムダ式の中で a を変更しようとすると許されないんだけど、これもなんで?
あとそれに関連してるかもしれないけど、const int a があったとして、a をコピーキャプチャして mutable をつけたラムダ式の中で a を変更しようとすると許されないんだけど、これもなんで?
799デフォルトの名無しさん
2022/09/29(木) 06:34:14.97ID:Jka8tyPG 最初にラムダ入れた時の設計ミス
800デフォルトの名無しさん
2022/09/29(木) 07:34:10.57ID:u1XdWODd ミスか?
俺はGJと思ったぞ
constの逆は欲しかった
明示的に書き込み許可すんの
俺はGJと思ったぞ
constの逆は欲しかった
明示的に書き込み許可すんの
801デフォルトの名無しさん
2022/09/29(木) 08:13:36.08ID:HMWtGy3T >>795
ドキュメントを配る
ドキュメントを配る
802デフォルトの名無しさん
2022/09/29(木) 09:51:48.04ID:r+IaQb6m ヘッダなんて特別なものはなくて
includeディレクティブがあるだけ
includeディレクティブがあるだけ
803デフォルトの名無しさん
2022/09/29(木) 13:54:32.28ID:o1fQB+Qf C++11以前なのでoverride演算子がないソースコードなのですが、
派生クラスでオーバーライドされている関数を簡単に見つける方法って
ありますか?
virtual関数を1つずつgrepするしかないですかね。
派生クラスでオーバーライドされている関数を簡単に見つける方法って
ありますか?
virtual関数を1つずつgrepするしかないですかね。
804デフォルトの名無しさん
2022/09/29(木) 14:30:55.43ID:o/ss6osA >>803 何の前提も無ければ自分がソース持ってないところでオーバーライドされてる可能性もあるので、
いろいろ前提を絞らないと無理かと。
override (「演算子」じゃなくて「キーワード」)があったとしても、付け忘れてる可能性もあるし。
いろいろ前提を絞らないと無理かと。
override (「演算子」じゃなくて「キーワード」)があったとしても、付け忘れてる可能性もあるし。
805デフォルトの名無しさん
2022/09/29(木) 15:19:58.87ID:o1fQB+Qf806デフォルトの名無しさん
2022/09/29(木) 15:27:09.76ID:OAAH5wr1 ヘッダに実装が書かれててもエディタでショートカット1個押して折りたたむだけでインターフェースすぐわかるくね?
807デフォルトの名無しさん
2022/09/29(木) 17:04:17.17ID:nKyEXpsu まっとうならバイナリなりだけ開発環境でインポートすれば、
綺麗にインターフェイスが見える。
綺麗にインターフェイスが見える。
808はちみつ餃子 ◆8X2XSCHEME
2022/09/29(木) 17:12:42.79ID:xXycU9Ev 共有オブジェクト (ダイナミックリンクライブラリ) の段階にまでなってしまうと型は別のところから与える必要があって、
基本的にはビルドの時に型情報を表すなんらかのファイルも生成できるけど、めんどいのは言語をまたぐときなんよね。
Windows API はいろんな言語から使えるような (バインディングの生成元に出来るような) メタデータを提供するという形で
対処しているのでこのへんは Windows API に限らず使いやすいように規格化や環境整備が進むことを期待している。
基本的にはビルドの時に型情報を表すなんらかのファイルも生成できるけど、めんどいのは言語をまたぐときなんよね。
Windows API はいろんな言語から使えるような (バインディングの生成元に出来るような) メタデータを提供するという形で
対処しているのでこのへんは Windows API に限らず使いやすいように規格化や環境整備が進むことを期待している。
809803
2022/09/29(木) 17:14:04.54ID:o1fQB+Qf 今はLinuxでgcc+vimを使っています。
どういう環境なら見えますか?
どういう環境なら見えますか?
810デフォルトの名無しさん
2022/09/29(木) 18:21:37.90ID:YHMprl0j gtagsとか?
811はちみつ餃子 ◆8X2XSCHEME
2022/09/29(木) 21:13:35.71ID:xXycU9Ev >>809
近頃は vim も LSP に対応してるはずだから clangd と合わせて使えばいいんでないの。
わいは vim についてはよう知らんけど VSCode では出来ているから原理的には出来るはず。
近頃は vim も LSP に対応してるはずだから clangd と合わせて使えばいいんでないの。
わいは vim についてはよう知らんけど VSCode では出来ているから原理的には出来るはず。
812デフォルトの名無しさん
2022/09/29(木) 21:39:32.67ID:o1fQB+Qf813デフォルトの名無しさん
2022/09/29(木) 21:44:06.62ID:YHMprl0j 似てねーw
814デフォルトの名無しさん
2022/09/29(木) 21:59:47.36ID:xIdOGMqx ええ…
815デフォルトの名無しさん
2022/10/03(月) 10:37:30.67ID:BGisZcin816デフォルトの名無しさん
2022/10/03(月) 10:40:19.01ID:BGisZcin >>790
template ですね判ります
template ですね判ります
817デフォルトの名無しさん
2022/10/05(水) 11:46:44.33ID:qhw2L+Ej サイズが可変な自作クラスXのvectorを持ちたいとします。
このとき、Xの実体をいくつかvectorに入れて不用意に各要素のサイズを変更すると、メモリの割り当てがおかしくなりますよね?
実体ではなくポインタを持つ以外のワークアラウンドはありますか。
このとき、Xの実体をいくつかvectorに入れて不用意に各要素のサイズを変更すると、メモリの割り当てがおかしくなりますよね?
実体ではなくポインタを持つ以外のワークアラウンドはありますか。
819デフォルトの名無しさん
2022/10/05(水) 12:31:37.02ID:Ghll8vG9 >>817
「サイズが可変なクラス」の簡単な具体例を教えてくれないかしらん?
「サイズが可変なクラス」の簡単な具体例を教えてくれないかしらん?
820デフォルトの名無しさん
2022/10/05(水) 12:38:22.59ID:zqJzN+DI >>817
出来ます
Xの参照(ポインタ等)のベクターを持ちます
Xのサイズが可変でバラバラでも構いません
もしXのサイズに上限値があるならば
別の方法としてその上限値サイズのベクターを用意する方法もあります
出来ます
Xの参照(ポインタ等)のベクターを持ちます
Xのサイズが可変でバラバラでも構いません
もしXのサイズに上限値があるならば
別の方法としてその上限値サイズのベクターを用意する方法もあります
821デフォルトの名無しさん
2022/10/05(水) 12:52:15.30ID:qhw2L+Ej >>819
boost::multi_array の resize
boost::multi_array の resize
822デフォルトの名無しさん
2022/10/05(水) 12:53:20.63ID:qhw2L+Ej823はちみつ餃子 ◆8X2XSCHEME
2022/10/05(水) 13:05:31.97ID:q7thXXzU sizeof の結果は常に定数なんだよね……。
https://timsong-cpp.github.io/cppwp/n3337/expr.sizeof#6
(C では VLA まわりで定数にならない場合もあってその挙動を拡張として取り入れている C++ 処理系もある。)
そういう意味ではサイズが可変なクラスは存在しない。
>>821
boost::multi_array もそれ自体の大きさは一定。
内部的にはポインタで保持してる。
https://timsong-cpp.github.io/cppwp/n3337/expr.sizeof#6
(C では VLA まわりで定数にならない場合もあってその挙動を拡張として取り入れている C++ 処理系もある。)
そういう意味ではサイズが可変なクラスは存在しない。
>>821
boost::multi_array もそれ自体の大きさは一定。
内部的にはポインタで保持してる。
824デフォルトの名無しさん
2022/10/06(木) 11:24:20.53ID:0pxze5TV やっぱり817が思ってる「おかしくなりますよね?」の最小コード提示してもらわないと
実はそれおかしくならないって結論になりそうなんだが?
実はそれおかしくならないって結論になりそうなんだが?
825デフォルトの名無しさん
2022/10/06(木) 14:37:24.06ID:BJfOFqw4 つまりおかしくなる理由が分からない人が相談に答えようとしているわけだな。
826デフォルトの名無しさん
2022/10/06(木) 15:08:29.15ID:cWE4RcCn827デフォルトの名無しさん
2022/10/06(木) 18:12:29.65ID:nyTo+ttU 「サイズ(sizeof)が可変なクラス」なんて存在しないから817が何かを勘違いしてるのは確かだが
何をどう勘違いしてるのか分からんからお前さんの信念でコード書いてみなって話だろ
別におかしくない
何をどう勘違いしてるのか分からんからお前さんの信念でコード書いてみなって話だろ
別におかしくない
828デフォルトの名無しさん
2022/10/06(木) 21:12:38.87ID:2ZLAwlmb829デフォルトの名無しさん
2022/10/07(金) 02:21:50.23ID:qb/V/k6I >827
単にお前の読解力の話でしかなかったのか。
「サイズが可変な」はvectorに掛かってると考えるだろうふつう。理由は
> 「サイズ(sizeof)が可変なクラス」なんて存在しないから
と自分で指摘してるとおり。
単にお前の読解力の話でしかなかったのか。
「サイズが可変な」はvectorに掛かってると考えるだろうふつう。理由は
> 「サイズ(sizeof)が可変なクラス」なんて存在しないから
と自分で指摘してるとおり。
830デフォルトの名無しさん
2022/10/07(金) 06:51:34.90ID:iCJcr8aJ 「サイズが可変な」はクラスに掛かってると考えるだろうふつう。vectorは当然サイズ可変なんだから
831デフォルトの名無しさん
2022/10/07(金) 07:35:25.67ID:BBv/2c76 sizeof(std::vector<T>)なんて気にせんだろふつー
832デフォルトの名無しさん
2022/10/07(金) 07:47:52.68ID:4lX0Ypwn まあクラスのサイズが変わるようなイメージだったよね
833デフォルトの名無しさん
2022/10/07(金) 08:23:09.11ID:0jEkBwds コード見せろ、この日本語が分からない奴に
このスレは無理
このスレは無理
834デフォルトの名無しさん
2022/10/07(金) 08:23:45.29ID:2UgM0KPC 質問者です
皆さんのおかげで解決しました
ありがとうございます
皆さんのおかげで解決しました
ありがとうございます
835デフォルトの名無しさん
2022/10/07(金) 08:24:03.77ID:2UgM0KPC もうこの話は終了でよろしくお願いします
836デフォルトの名無しさん
2022/10/07(金) 11:13:53.12ID:p6wqSRzL 817の類似
https://ideone.com/81vcNn
e1, e2 と list の要素は別物だけど (2) の操作で list も同じく反映するようにするには
list を vector<X*> として ポインタ渡す他に何か手段あるのかな
https://ideone.com/81vcNn
e1, e2 と list の要素は別物だけど (2) の操作で list も同じく反映するようにするには
list を vector<X*> として ポインタ渡す他に何か手段あるのかな
837デフォルトの名無しさん
2022/10/07(金) 11:34:57.30ID:fogpWmkA std::vectorもboost::multi_arrayも要素数の変更ができるけど、その可変可能個数要素を格納する領域はクラスのインスタンスとは別のヒープ領域に確保されるようになっていて、クラスのインスタンにはそのヒープ領域へのポインタが格納される
したがって要素数を変更してもクラスのインスタンのサイズは変わらない
だよね?
したがって要素数を変更してもクラスのインスタンのサイズは変わらない
だよね?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 東京株式市場 インバウンド関連株が下落 中国政府の渡航自粛要請で [バイト歴50年★]
- 橋下徹「口だけ番長の日本が中国に喧嘩負け。なんとカッコ悪い日本か!」高市にバチーン!✴ [153490809]
- 【高市早苗】習近平激怒か [115996789]
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
- 🏡
- ワンピースの評価ガタ落ちしてるけど尾田っちのメンタルが心配
- ガンダム←名言ばかり エバー(笑)←こいつ(笑)
