C++相談室 part166

1sage (ワッチョイ 8732-NXaD)
垢版 |
2025/04/26(土) 10:34:58.41ID:pbPDl6lv0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

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

※前スレ
C++相談室 part165
https://mevius.5ch.net/test/read.cgi/tech/1698705458/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2025/04/26(土) 10:36:05.71ID:pbPDl6lv0
仲良く使ってね
2025/04/26(土) 11:57:58.29ID:9PQ55tI10
STLでサイズがウンタラカンタラってなくなったんだね
4デフォルトの名無しさん (ワッチョイ 797c-VXNn)
垢版 |
2025/04/26(土) 13:02:57.57ID:90F8pztq0
あれはキチガイが勝手に貼り続けてただけでテンプレでもなんでもない
5デフォルトの名無しさん (ワッチョイ bfda-OmX0)
垢版 |
2025/04/29(火) 19:50:22.01ID:oiFKb7iS0
プログラムの書き方について学ぶためのサンプルコードですが、
CならLinuxGNUやBSDなど山ほどあるけど、C++の場合は定番としてどんなものがありますか?
2025/04/29(火) 20:44:07.29ID:snW2quW50
C++標準ライブラリ チュートリアル&リファレンス
っていう分厚い本読んどけば大体理解る
2025/04/29(火) 21:19:32.60ID:d6I4gAkZ0
C++のOSSねえ
有名でコードの質がいい奴だとLLVMか?Clangも読めばコンパイラだから言語の勉強にはなるはず
規範的って意味だとBoostだけど、いきなり勧めるには技巧的で上級者向けすぎやな面白いけどね
あと有名所ならOpenCVだけどあれは汚いから真似してほしくない
2025/04/29(火) 23:01:06.57ID:LJmfvcqY0
Open CASCADE も汚いのでお勧めしないなぁ
9デフォルトの名無しさん (ワッチョイ b720-xasm)
垢版 |
2025/04/29(火) 23:56:21.35ID:qhqmYF5L0
ライブラリだと各OSに対応するためのコードだったり、ヘッダーオンリーにするためのテクニックだったりで、純粋なC++プログラムの勉強として見るとノイズが多いかもしれない
実は初心者向きの良い教材ってあんまり無いかも?
中級者以上ならBoostなどは勉強になるけど、簡単ではないし
2025/04/30(水) 00:21:11.63ID:en7310Kb0
いろいろとフリーダムすぎてなあ そこがいいんだが

たとえば、ゲーム作りたかったら既存のゲームエンジン、とか、
やりたいカテゴリか近いところの、長続きしてるところの読んでみるといいかも

答えになってないが、(自分用であれ仕事であれ)使わされるのが一番早い
2025/04/30(水) 00:58:19.68ID:TMleEpRy0
Windowsの電卓は平易で初心者向きかも
Google系も平易な印象だけど、Googleは独自ユーティリティを多用しがちなのが難点
2025/04/30(水) 09:16:57.03ID:THYm3xdc0
C++ は言語として特定のスタイルを強制しないという方針を持っているからプロジェクトによって構成の仕方は全く違う。
適当な数個のプロジェクトを見ても数個のスタイルがわかるというだけでしょ。
どれが良いかとか言ってないでたくさん見るしか仕方ないんじゃないかな。

入門書とかいくつかの設計指南系の本くらいは読んでる?
理念抜きで結果として出来上がってるコードを見てもわけがわからんと思う。
本はたくさん読んだほうが良い。

それと C++ は今は三年ごとに規格の改定がある。
どの版を想定するかでもかなり違う。
特に大きなターニングポイントになってるのは C++11 と C++20 だと思う。
最新の GCC で特に指定しなければ C++17 として解釈されるのでこのあたりが現在の普通という感じなはず。
13デフォルトの名無しさん (アウアウウー Sa1b-Dl8r)
垢版 |
2025/04/30(水) 09:52:26.68ID:uCqRd3Swa
>>5
wxWidgets
14デフォルトの名無しさん (ワッチョイ b720-xasm)
垢版 |
2025/04/30(水) 12:58:39.49ID:8LRHZRl/0
Windows … というか Visual Studio だと今でもデフォルトは C++14 なんだよな
機能的には C++23 まで使えるのに
2025/05/04(日) 16:06:14.75ID:/Tm3kYwr0
初心者スレないんですまん。

C++でvectorとsetで同じことやらすのってどうやるの?
cout << vec << endl;
cout << st << endl;
を共通で書きたいんだけど、
template?の書き方がわかんないの
2025/05/04(日) 18:28:39.39ID:w7r9Yiaa0
>>15
きちんと諸々に配慮しようとすると面倒なんだけど本当にそれが出来ればよいだけならこんな感じで出来なくはない。
https://wandbox.org/permlink/2CaqGO3tiB7G9tCZ
2025/05/05(月) 16:19:33.69ID:WDPor1X60
>>16
ありがとうございます。

std::endlの代わりに' '(空白)を使うことはできませんかね
図々しくごめんなさい
2025/05/05(月) 17:57:32.37ID:7tS1Ts+e0
>>17
まさに「諸々に配慮」と述べた部分がそれでね……。
ここで定義した operator<< と元からある operator<< の両方が char を受け取ることが可能なので
どちらを呼び出すべきか曖昧なオーバーロード (ambiguous overload) になってしまっている。

ちゃんとやる場合はここで定義する operator<< が受け取れるのはコンテナに限定しなければならない。

型に制約を付ける真っ当な方法が入ったのは C++20 からなのでそれ以前の C++ でやろうとすると回りくどいんだよ。
C++11 でなるべく簡素に書くとしたらこんな感じかな。
https://wandbox.org/permlink/Hli0dW7vNwSICQmp
2025/05/06(火) 12:29:11.51ID:tCHDdC6b0
>template <class T>
>auto operator<<(std::ostream& os, const T& container_object)
> -> typename std::enable_if<!!sizeof(begin(std::declval<T>()) != end(std::declval<T>())), std::ostream&>::type {
横から何じゃこりゃw
2025/05/06(火) 12:35:30.96ID:SvTeM3j90
declval は要らんな。
もっとキッチリしたほうがいいのか簡素にしようか迷ってちょっと変な感じになってる……。
2025/05/06(火) 13:03:38.40ID:tCHDdC6b0
>>20
いやいや非難ではなく
俺が知っているC++じゃないw
- operatorの前のautoは何ぞ?
- !!演算子?
2025/05/06(火) 13:42:19.73ID:SvTeM3j90
>>21
関数名の前に auto を書くと仮引数の後ろに返却値の型を書けるようになる。
つまり -> から { までのところに書いてるのが返却値の型。

従来の書き方では関数の仮引数を返却値の型を決定する文脈では使えないというルールがある。
たとえば
template<class T> decltype(e) foo(const T& e) {return e;}
というようなことは出来ない。 ここで e を参照することは出来ない。

後置では返却値の型を書くところで仮引数を使ってかまわない。
template<class T> auto bar(const T& e) -> decltype(e) {return e;}
ってのはアリ。

この場合の auto は返却値の型を後置するというマークってことね。
後置にする必要がなくても後置で一貫させてるプロジェクトもたぶん結構ある。
auto がこのような用途で使えるようになったのは C++11 からなのでもう結構浸透してると思うんだけど、全く見たことないの?

!! は ! をふたつ並べてるだけ。 bool にキャストする代わりに使うイディオムなんだけど見づらいからやめたほうがよいという人も多い。
2025/05/06(火) 14:29:32.39ID:tCHDdC6b0
>>22
解説を有難うございます
返り値を後置する記法のアドバンテージが分かりました
>>18は返り値を後置にしてるけどもこれは必須ではないということね
!!も分かりました(g++-12はなしで通ります)
2025/05/06(火) 16:07:03.30ID:SvTeM3j90
>>23
> !!も分かりました(g++-12はなしで通ります)

非型テンプレートパラメータで size_t (sizeof の結果) から bool への変換 (縮小変換) は認められていないはず……
……と思ったらこれには例外があってコンパイル時計算の文脈で実際には情報が欠落しないなら OK。
つまり整数の 0 か 1 のときに限り (型の大きさとしては小さくなる変換であっても) bool に変換が可能。
2025/05/06(火) 17:28:20.12ID:GbYxwNEQ0
非0ならtrueやないんか
2025/05/06(火) 18:05:53.77ID:SvTeM3j90
>>25
せやで。 こういうときは変換されない。

template<bool num>
class foo {};

int main(void) {
foo<2> bar;
}

通常の暗黙の変換で許されていても非型テンプレートパラメタでは縮小変換はされないので↓みたいなのも駄目。

template<unsigned char num>
class foo {};

int main(void) {
foo<1000> bar;
}
2025/05/06(火) 18:35:49.00ID:jhNAw2EC0
>>18
重ね重ねありがとうございます。
なんとか理解してみます。

C++20だとどうなります?
一応、C++の新機能ってぺージ見たんですけど、よくんからなくて
2025/05/06(火) 18:36:01.85ID:nZOyiL0Ra
enable_ifは便利だけど使ったら負け感が半端無い
2025/05/06(火) 19:26:25.22ID:SvTeM3j90
この場合は enable_if は本来の意味で使ってないしな。
2025/05/06(火) 20:07:39.20ID:SvTeM3j90
>>27
こんな感じかな。
https://wandbox.org/permlink/IgEx8yRTGMZ2qr6U

C++20 からはイテレータの概念も再編されて range という概念で扱うのが好ましいということになり、コンテナは range の一種だったことになった。
コンテナの中のここからここまでという範囲を表すものを中心にした考え方で、コンテナ自身も range だし、コンテナの除き窓のような view も range 。
Rust とか Go で言うスライスみたいなもん。

で、テンプレート引数として受け取った T が std::ranges::range の制約を満たすものなんやでという制約を入れることによってそうじゃないものはマッチしないように出来るし、
他の operator<< の候補にマッチするものがあるのならそっちが選ばれるようになる。
2025/05/06(火) 21:47:53.45ID:jhNAw2EC0
>>30
ありがとうございます。
rangeはときどき見てたんですけど、ぱっと見あんまり必要性がわからなかったんですけど、こういう理由があったんですね。

これから時間があるときは、rangeを意識して書きたいと思います。

ありがとうございました
2025/05/07(水) 09:06:41.19ID:pa9hjTXM0
>>29
ostreamあんま詳しくないので本来の意味じゃないってのが良くわからんかった
コンテナでなければ弾くようにしてるんだと思うけどsizeofで括ってるのは式自体が評価されないようにするため?
2025/05/07(水) 09:38:53.26ID:jrPMMEx+0
>>32
そう。
実態としては sizeof の中の式が成立するかどうかだけが判定基準になってる。
sizeof が 0 を返すことはあり得ないわけだし sizeof の中の式が成立しないなら enable_if で判定する以前に弾かれるわけなので enable_if は判定の役に立ってない。
式を書く場所があるならなんでもよかったんだけど最終的には ostream& になってもらわないといけないので enable_if が楽だったというだけ。
2025/05/07(水) 09:53:44.11ID:zHwjwbR2p
あーなるほど、意味がわかった
ありがとう
2025/05/07(水) 22:31:24.20ID:OFqp/W1O0
vectorって、
宣言時に、要素数と初期値を設定できないっけ?
気持ちとしては、、

vector<int> my_data(3) = { 6, 8, 44 };
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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