C++相談室 part145

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2019/09/13(金) 17:13:24.60ID:/ygW08Jq
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part144
https://mevius.5ch.net/test/read.cgi/tech/1563769115/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
2019/10/05(土) 16:03:17.50ID:NXndjuW4
だれか、俺に分数を教えてくれないか?
足し算と引き算がマジ解らなくなってるんだ。
https://ideone.com/IfCcGz

一番のネックはネガフラグの扱い。
マイナスとプラスの反転演算でどうかくとスマートだろうか。
だれか教えてプリーズ。
2019/10/05(土) 16:21:25.21ID:bnoeYdBm
分子に符号もたせりゃいいだろ
2019/10/05(土) 16:25:36.94ID:NXndjuW4
>>373
え、それでよかったっけ?
2019/10/05(土) 16:34:31.54ID:hwiNAqBO
>>350
今習わないよ
俺の時でも選択
2019/10/05(土) 17:18:56.47ID:NXndjuW4
一応以下のような感じになった。Thx!
http://coliru.stacked-crooked.com/
2019/10/05(土) 17:19:54.63ID:NXndjuW4
http://coliru.stacked-crooked.com/a/5fa6ab838f9ff15a
こっちだった。Orz

んじゃ。
378デフォルトの名無しさん
垢版 |
2019/10/05(土) 17:28:26.58ID:QHD8CUaF
>>377
1. constexprにしてもいいんじゃない?
2. 出力関数作成しよう

template<typename Char>
std::basic_ostream<Char>& operator<<(std::basic_ostream<Char>& os, const Fraction& frac){
return os << frac.GetNumerator() <<'/'<<frac.GetDenominator();
}
2019/10/05(土) 19:08:43.36ID:NXndjuW4
>>378
1.できなくはない。機械的に接頭語つけるだけでいいよね。
2.暇だから作るわ。

行ってきまーす。
2019/10/05(土) 19:46:54.47ID:NXndjuW4
https://ideone.com/uzd7EF
ただいまー。イデオンで動かせるようにした。Gcdがバグってないといいなぁ。
あとvc2019では意味不明なエラーで動かない。
2019/10/05(土) 19:58:28.51ID:NXndjuW4
フィードバックハブに投げておいた。
382デフォルトの名無しさん
垢版 |
2019/10/06(日) 10:28:58.03ID:yc9LKsYB
>>380
マルチ禁止
2019/10/06(日) 13:42:53.69ID:bPt7YQEe
>>382
ソーリー。
2019/10/07(月) 19:17:43.20ID:PHxdOQnu
C++ってなんでヘッダファイルいるんですか
最近マシン早いんだし
全部ソースに書いてインポートすればいいのに
2019/10/07(月) 19:38:58.27ID:Xs+XlBV4
やれば?(クレヨンしんちゃん風に)
2019/10/07(月) 19:52:54.51ID:9pxPpXZa
来年まで待ってね
2019/10/07(月) 20:58:42.59ID:A3KSW75p
>>384
むしろソースがいらなくて全部ヘッダに書けばいい
inline変数とかもできるようになったことだし
2019/10/07(月) 21:05:07.29ID:8FnUNDHt
>>387
たまに趣味で何でもかんでもtemplateでゴリゴリ実装してるとガチでそれになるww
2019/10/07(月) 21:26:10.24ID:YMM6HSZT
>>385
ヤレばデキるは魔法の言葉
2019/10/08(火) 09:06:39.07ID:xr4jQIWZ
プリコンパイルヘッダーって使ってます?

使っているプロジェクト見たことないですわ。
2019/10/08(火) 20:03:58.69ID:kGAGzuS0
>>387
こういう馬鹿野郎が出てくるからメタプロとかテンプレ好き連中ってのは嫌いなんだよ。
2019/10/08(火) 21:04:41.31ID:OCfPMe68
C++なんて趣味でやってるんだからテンプレ好きでもええやん
2019/10/08(火) 21:16:41.69ID:/kdim2Vo
出てくることの何が嫌なんだろうか
はっきり言って病気だ
2019/10/08(火) 21:42:59.95ID:lGNioH0G
headerオンリーってのは可搬性に優れた良いものだろ
特にテンプレート多用している奴は、一部関数だけソースファイル分離する意味が薄い
2019/10/08(火) 21:43:38.32ID:asJ1ctJB
>>391
どんなものにだって馬鹿は出てくるだろうに
2019/10/08(火) 21:54:07.26ID:J87hrB1p
「全部ヘッダ」と言われると、そのときの「ヘッダ」の定義がどういうものなのか気になる。
2019/10/08(火) 21:57:19.52ID:EwyBASw5
趣味でやってる人は全部ヘッダでいいと思う
2019/10/08(火) 22:09:52.63ID:tSj7di+z
>>390
VCのやつは使いまくり
依存するライブラリのヘッダファイルを標準のやつもソリューション内のやつも全部まとめて
stdafx.hの中でインクルードしたらことのほか便利
ただし同じプロジェクトのヘッダファイルを入れだしたら目的を見失って氏ぬ
2019/10/08(火) 22:10:50.35ID:hpLG4xMo
テンプレート関数は便利だしconstexpr関数は市民の義務だし
結局ほとんどヘッダファイルに書くことになるでしょ
2019/10/08(火) 22:30:34.35ID:X4FGjRpd
初心者ですが質問させてください

print(1, 3.14, "abc");とやると引数の中身を順番にスペース区切りで出力してくれるような関数は
可変引数テンプレートの再帰呼出しを使うと便利にできることを知りました。
そこで引数の型に応じて出力の見た目を少し変えたいのですが、
関数の特殊化をすればいいですか?
typeidだと動的な評価になってしまうんですよね?
2019/10/08(火) 22:33:59.15ID:kGAGzuS0
予想通りの馬鹿回答で笑ってしまった。
やっぱいい判別になるわテンプレバカ。
2019/10/08(火) 22:37:33.87ID:jfG+k1ni
>>400
引数一つに対するテンプレート関数を作って特殊化してそれに少しずつ渡せばできるよ。
2019/10/08(火) 22:42:38.66ID:/kdim2Vo
C++嫌いなのにいつまで居座るんだろうなこのガイジ
2019/10/08(火) 22:57:34.25ID:HxNAD6ah
好き嫌いの問題じゃねーんだわ
2019/10/08(火) 23:04:05.43ID:/kdim2Vo
こんな雑談スレ好きな奴以外に需要ないだろ
こんな辺境別に見なくて良いんだよ?
2019/10/08(火) 23:08:13.69ID:hpLG4xMo
>>400
c++17以降ならif constexprとstd::is_same_vの使用を検討してみるのもいいかも
2019/10/09(水) 04:08:22.18ID:NmoqHfbB
400です。頑張ってみましたがどうにもコンパイルエラーが出ます
難しいですねC++は...

void print() {}

template<class... Args>
void print(const char* c, Args... args) {
cout << "[" << c << "]" << endl;
print(args...);
}

template<class First, class... Args>
void print(First first, Args... args) {
cout << first << endl;
print(args...);
}

int main() {
print(1, 3.14, "abc");
return 0;
}
2019/10/09(水) 04:17:51.46ID:NmoqHfbB
あ、こういうふうにするとコンパイルできました。引数2個の関数を特殊化したからエラーになった?
テンプレートの展開のされ方がよくわからないけど、とりあえず目的のことはできました
ありがとうございました

void print(const char* c) {
cout << "[" << c << "]" << endl;
}

template<class T>
void print(T t) {
cout << t << endl;
}

template<class First, class... Args>
void print(First first, Args... args) {
print(first);
print(args...);
}
2019/10/09(水) 04:21:52.30ID:NmoqHfbB
>>406
いわゆる型特性というやつでしょうか?enable_ifを使うのかと思い試したもののうまくいかず、
ネットで調べるとenable_ifと可変引数テンプレートは相性が悪いという意見を見つけたり...
2019/10/09(水) 07:02:07.47ID:8qv563yz
>>409
if constexprを使った例はこんな感じ
template<class First, class... Args>
void print(First first, Args... args) {
if constexpr(std::is_same_v<First, const char*>){
std::cout << "[" << first << "]" << std::endl;
} else {
std::cout << first << std::endl;
}
if constexpr(sizeof...(args)>0){
print(args...);
}
}
411デフォルトの名無しさん
垢版 |
2019/10/09(水) 10:59:59.89ID:RbUf+g7C
const char * 自体も class First や class Args と一致するんじゃね
2019/10/09(水) 21:59:58.44ID:8qv563yz
First と Argsの二つがあるのがややこしい場合は畳み込み式でもできるぞ

template<class... Args>
void print(Args... args){
  ([](auto t){
    if constexpr(std::is_same_v<decltype(t), const char*>){
      std::cout << "[" << t << "]" << std::endl;
    } else {
      std::cout << t << std::endl;
    }
  }(args), ...);
}
2019/10/09(水) 22:42:32.58ID:J+0BhmRu
win系のOSの画面に1.txt~5.txtがあります。1.txtと2.txtをドラッグして選択したとします。
この状態で3.txt~5.txtを選択したことにするにはどのようなコードを書けば良いですか?
2019/10/09(水) 22:52:59.82ID:bPxMjWa1
>>413
ListView_SetItemState
2019/10/10(木) 00:29:05.87ID:uUO69neG
エクスプローラにdll注入とか?
2019/10/10(木) 01:32:41.34ID:VnnXeZwz
前にやったことがある。
https://github.com/katahiromz/SysNotifyHooker
2019/10/11(金) 01:40:25.90ID:n351RXRL
std::shared_ptrを構築後に(カスタム)デリータを変更するのは無理?

既にどっかで作成済みのshared_ptrについて、破棄タイミングを後から見れないかなと
2019/10/11(金) 02:44:16.61ID:uKeO6WuZ
別のstd::shared_ptrをカスタムデリータ付きで構築してswapすれば
2019/10/11(金) 04:06:16.56ID:RvdWaBLb
shared_ptrとunique_ptrでdeleterの指定方法が違うってのが興味深いね。
2019/10/11(金) 12:29:56.77ID:w5dDNHMJ
VCのlatestでchar8_tが入ってたわ
やっとC++erが文字コード問題から解放されるんだな
2019/10/11(金) 14:00:32.34ID:XWYiG0pn
やったぜ。
2019/10/11(金) 15:19:50.16ID:iqVlf+4W
>>418
デリータごとswapされたわ
stackoverflowにも似たような質問があったけど結論としては出来ないっぽい
たぶん
2019/10/11(金) 23:12:48.13ID:WXWRLB/C
>>392
別にテンプレ好きでも構わんが、C++ユーザー全員が趣味だと思ってんの?
2019/10/11(金) 23:15:04.89ID:WXWRLB/C
>>405
雑談以外に役に立つ書き込み出来なくてすみません、ってことか
2019/10/12(土) 08:08:31.86ID:vgsPsMOm
>>423
C++ユーザが全員趣味なんてどこにも書いてないし、あるプログラミング言語が趣味でしか使われてない状況なら、委員会なんていらないわwww
2019/10/12(土) 08:48:46.65ID:fl5cgmi7
衣食住の確保以外の仕事なんてみんな趣味みたいなもんだよ
なくたって構わんのだから
2019/10/12(土) 08:58:25.57ID:rY+KRAa3
農業以外は遊びってことか!
2019/10/12(土) 09:03:04.22ID:tzOo7sle
原始人から見たら1次産業以外は遊びだしそうだろ
2019/10/12(土) 09:06:03.19ID:w6XAfbR5
委員会なんて何の役にもたってねーだろ。
構文解析もまともに理解できてないバカが俺様仕様の理想に突っ走ってるだけのクソ組織で、
仕様の実装、デバッグの手間なんてこれっぽっちも考えてないのがよくわかる。
2019/10/12(土) 09:14:16.17ID:Fi90LVHu
デバッグできねえのを人のせいにするクズがよく言うぜ
2019/10/12(土) 09:54:19.46ID:DT43rpFP
近年は新機能は三大コンパイラ(GCC,MSVC,Clang)での試験実装が入ってから仕様入りするのが普通になってるし
コンセプトなんてまさにデバッグの手間の軽減を第一目的に苦心して作られた機能なんだけど
どのへんを見てよくわかったのか教えて
2019/10/12(土) 10:00:51.19ID:w6XAfbR5
>>431
実装したことないやつは黙っててね。
で、そのコンセプトを実際のコードでコンパイルした時間がどれくらいになるかわかってる?
そういう有用なベンチマークもほとんど出さずに無理やり入れようとするから
信頼を無くしてるんだよ。
2019/10/12(土) 10:19:47.03ID:Nq/Z/R6A
経験したことは全て正しいっていう日本特有のアホ理論だろそれ
経験してないお前に発言権は無い、っていう
その理屈を持ち出すヤツは大抵はアホ
2019/10/12(土) 10:24:58.21ID:69fBrMS4
コンパイル時間は、コンパイラの出力する最適化されたバイナリの実行速度に比べたら問題ではないだろ

しかも構文解析にかかる時間なんて最適化時間に比べりゃ屁みたいなもの
2019/10/12(土) 10:26:15.49ID:mYzO26Pi
似たようなものを複数書いてもバグ修正時に一部見落としなんて馬鹿げたことになるわけで
マクロでもテンプレートでもまとめられるものはまとめたほうがいいわな
2019/10/12(土) 10:27:43.23ID:69fBrMS4
c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、テンプレート時の記述でtypename やらtemplateやらで、識別子の種類自体を指定する羽目になっているのはあるよね
2019/10/12(土) 11:23:13.45ID:zNYGVDyE
>>434
テンプレートふんだんに使ったライブラリ実用してるとひどいことにはなる
アプリ自体は数万行なのにコンパイル10分以上とか
2019/10/12(土) 11:27:59.19ID:KmpqQhzT
>>432
お前が信用しないのは勝手だが、みんなの総意みたいに言うなよ
2019/10/12(土) 12:09:52.46ID:73DoxmjF
数万行で10分が早いのか遅いのかよくわからない
2019/10/12(土) 12:15:22.09ID:69fBrMS4
それは本当にパースの複雑さのせいなのかは疑問だな
templateだと、プログラマは簡単にコンパイラの仕事をあまり意図せず増やしてしまいがちだからね。

std visitで引数増やすとコンパイル時間は簡単に増やせるよ。
5つくらいでもうコンパイラが落ちたりする
やらせていることの面倒くささ、それを手書きすることを考えれば妥当なのだけど
2019/10/12(土) 12:41:57.75ID:Tqr7IA/6
最近C++触ってないけど数万程度で10分もかかるの?
10万行程度なら5分以内に終わってほしいところだけど…
2019/10/12(土) 13:13:02.91ID:trzfpzAc
>>439
かなり遅いです。
ヘッダファイル *.h とソース本体のファイル *.c では事情が違いますが、
OSのバージョンによりますが、Win32の標準ヘッダファイルの windows.h などだけでも
コメントを除外しても2万行弱くらいあります。
これのパースは、VC++で1秒〜数秒くらいです。
通常は、precompiled header を使うので、一つのプロジェクトで一度だけ
パースされることが多いです。
ただし、プロトタイプ宣言やマクロ定義、構造体定義、inline関数定義
などだけで、実際のコード生成は伴わないので、*.c の数万行とは
また事情が違います。*.c はコード生成を伴うので、同じ行数であれば*.hよりも
遅くなる傾向があります。
しかし、それでも、C++98 の場合、数万行だと3秒〜10秒以下でコンパイルできます。
2019/10/12(土) 13:23:47.19ID:UpKv7BB3
↑こいつはVSスレで有名なキチガイなので放置で
2019/10/12(土) 13:24:45.74ID:69fBrMS4
c++の文法のせいでパースが遅いってレベルの話じゃないような
2019/10/12(土) 15:33:32.46ID:UCFxfzGx
ヘッダオンリーのライブラリがポータブルとか言われてもてはやされるのがc++だからね
生産性の意識が間違った方向に向いてる
コンセプトでどうなることやら
2019/10/12(土) 15:52:13.73ID:K75UXpIa
俺の10万行程度のアプリは1分以内にコンパイル終わるが・・・
10分てどこの世界だ
2019/10/12(土) 19:26:26.29ID:8VsKOlOD
「参照の配列」を作りたいときって現状 reference_wrapper を使う以外ないですか?
2019/10/12(土) 20:29:07.16ID:iehpkqJW
ポインタやスマポじゃいかんのか
2019/10/12(土) 20:55:57.96ID:cS98TRHZ
>>437
プリコンパイルヘッダー使え…!

>>446
VC++2010の場合配列要素のアドレスの配列というのを
それぞれ1万行ぐらい書いてリリースビルドすると10分かかる
2019/10/12(土) 23:18:34.83ID:zNYGVDyE
spiritで構文解析させてたコード(その上et使った自作ライブラリあり)だから例として極端だったかもしれんけどね
プリコンパイルドヘッダは使ってたよ
効いてるときは数分かからなかったと思う
というか5年以上そのコード使ってないんで今のマシンならまだマシになるとは思う
2019/10/13(日) 01:04:01.79ID:2Ilco01g
boostを多用した10数万行のソースでprecompileありでreleaseビルドしたら10分くらいかかってたけど、debugビルドでは1,2分くらいだった気がする。パースだけなら大したことないけど最適化がかなり遅いと思われる。
2019/10/13(日) 01:06:42.02ID:uORMYh+w
翻訳単位が増えると単純に遅くなるし
リンク時最適化でもさらに遅くなる
2019/10/13(日) 01:16:58.35ID:Fwjkj11x
LTOは本当のリリース時や速度検証の時以外は外しても問題ないよね
2019/10/13(日) 09:37:54.86ID:kfwaB+Y7
ここの話で出ている

>296
>>294
clangさんが教えてくれた
std::string hogehoge() { return A<_T3>::template get<std::string>();}

>436
c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、
テンプレート時の記述でtypename やらtemplateやらで、
識別子の種類自体を指定する羽目になっているのはあるよね

<_T3>::templateやtypenameをどの様な場合に書かないといけないのか?
この辺を解説した初心者向けか入門者向けの解説サイトみたいな所が
何処かに有りませんか?
サイトが無さそうなら検索に向いている単語みたいなのでも有れば助かる
::templateとかで検索しても上手く引っ掛からないみたい(有るには有るけど少ない)
2019/10/13(日) 10:06:17.74ID:zTi0Tc1S
コンパイラが出すメッセージで検索してみれば?
2019/10/13(日) 11:14:46.72ID:Fwjkj11x
>>454
https://ja.cppreference.com/w/cpp/language/dependent_name
457デフォルトの名無しさん
垢版 |
2019/10/13(日) 17:23:21.82ID:Y0ptPfKA
他の言語で書かれたコードをスクリプトの要領で
C++から呼び出して実行したいのですが、
そういった事をするのに適した言語ってどういった物があるのでしょうか?
2019/10/13(日) 17:23:50.21ID:Y5pFrXym
>>457
パイソン
2019/10/13(日) 17:31:01.31ID:9auzzyVZ
言語間のABIの違いを透過的にしたいのならアセンブラの出番だね
2019/10/13(日) 17:36:26.67ID:1+8oai62
まさにそういう用途で作られたluaとか
2019/10/13(日) 17:44:25.71ID:j3fG3YC6
>>457
今ならluaかjs(V8/ChakraCore/SpiderMonkey)だな。

【Lua】組み込み系言語総合 その7【Squirrel】 [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1474536226/

pythonもできなくはないけど手軽とは言えない。
pythonを使いたい理由がなければやめておくのが吉。
2019/10/13(日) 18:10:48.99ID:pJwii1Hg
pythonは呼ぶ方で、呼ばれる方としてはほとんど想定されてないわな。
2019/10/13(日) 19:05:43.03ID:m8H1BiEu
lua以外無い
2019/10/13(日) 19:35:48.57ID:rjz838Ki
>>457
tcl
2019/10/13(日) 20:24:22.36ID:kfwaB+Y7
>455,456さんどうもです

エラーが出たらそうしてみます

リンク先を読んで見ましたが
自分には難しいのでそのページを手がかりに検索して(依存名で探してみた)
漸く理解出来た気がします

前にstd::を付ける付けないって話を何処かでしてい
自分的にはどうしたものだろうか?
って感じだったんですけど
adlやtwophasenameとかの解説と合わせて書いて有るのを呼んでいて
std::を付けるのはかなり重要なんだと思えてきた
今までnamespaceって単なるグループ名を付けている
くらいの感覚だったんですけど
意外と重要なんですね

どうもでした
2019/10/14(月) 15:05:53.73ID:rfaLGQBa
template<size_t N>
class Test{
public:
private:
int m[N];
};

上の様なクラスでコンストラクタでmを値を指定して初期化したいんだけどNの数は未定ではないですか。

こういう場合のコンストラクタの書き方ってどうすればいいのでしよう?
可変引数?
2019/10/14(月) 15:12:05.32ID:BPBGG2nS
コンパイル時に決まってないならvectorかなんかにするしかない
2019/10/14(月) 15:18:08.00ID:P81x9Tjl
templateパラメータの整数にはコンパイル時に決まらない数値は入れられない
2019/10/14(月) 15:28:00.19ID:qN7fFVrS
>>466
そもそも、そのような生配列は、デフォルトでは0初期化もされないので、
メンバ初期化子リストを使わなくても効率は落ちないので、
コンストラクタ内部で普通に代入演算子を使って初期化すればいい。
すると、単に任意個数の引数をコンストラクタに渡す問題になる。
それには、昔ながらの va_list を使って渡す方法と、
関数テンプレートやテンプレートクラスを使って、自分自身を一つずつ引数を
減らしながら呼び出していく方法の二通りある。
2019/10/14(月) 15:28:52.79ID:Y7o3BEyU
>>466
Test(std::initializer_list<int>&& arg)
{
std::copy_n(std::begin(arg), N, std::begin(m));
}
2019/10/14(月) 15:30:45.59ID:rfaLGQBa
>>469

一度考えたのはテンプレートの可変引数なんですが

//Testのコンストラクタ
template<typename... T>
Test(T... args):m{args...}{
}

templateの可変引数の為にどんな型でも一致してしまい、そのくせにdoubleからintなどの変換をしてくれないのでinitializer_listを引数に出来たり、もしくはもっといい初期化方法があるのかなと思った次第です。
2019/10/14(月) 16:18:31.70ID:1VO4fG6M
http://ideone.com/TPZu2J
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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