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/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
2019/10/14(月) 16:48:34.42ID:REdvl5Gt
>>471
>そのくせにdoubleからintなどの変換をしてくれないので
この点に関しては、以下の拡張展開でいけるはず。
template<typename... T>
 Test(T... args):m{((int)args)...}{
}
2019/10/14(月) 16:55:25.15ID:REdvl5Gt
templateの「非型引数」を使えば、理論上は、
template<int...args>
Test(int...args):m{args...}{
}
と書ける可能性はあるかもしれないけど、試してみてないので分からない。
2019/10/14(月) 17:04:44.38ID:REdvl5Gt
C++11 から、template 仮引数(パラメーター)に非型パラメーターパックが使える。
分かっているとは思うけど、このパックとは可変長引数をまとめて入れる容器の様な意味。
実際にやってみてないのでわからない。

https://en.cppreference.com/w/cpp/language/template_parameters

【Non-type template parameter】
type ... name(optional) (3) (since C++11)
3) A non-type template parameter pack with an optional name.
2019/10/14(月) 17:48:47.38ID:DdI7aqm2
>>466
要素数がコンパイル時に決まってるなら std::array 使って Test<3> x{{1,2,3}} とすることは簡単にできそう。
477デフォルトの名無しさん
垢版 |
2019/10/14(月) 20:20:29.10ID:ljIrzJ7B
>>464 >>457
tcl + 1
478デフォルトの名無しさん
垢版 |
2019/10/16(水) 00:49:52.16ID:4OT/K/L6
>>473 Thank you!!
2019/10/18(金) 03:20:02.11ID:kbBE7aSe
他クラスのメンバ関数テンプレートを呼び出すときってtemplateキーワードを関数名の前に付けないと
operator<と間違われてエラーになりますですよね?具体的に例をあげてみますと

https://wandbox.org/permlink/F7zl1fDh3qc216hd

これの t.template func<T2>(); のところですが、実はこのtemplateキーワードを外しても
WindowsのVisualStudioだとコンパイルが通ってしまいます。
これってVisualStudioが規約違反しているという理解で合っていますか?
2019/10/18(金) 03:32:35.18ID:L8qU11hp
vsのバージョンは?
2017の途中からtwo phaseに対応しだしてtemplate周りの怪しい挙動は大分改善された
2019/10/18(金) 11:35:03.93ID:kGqx1xn0
>>480
Express 2017 for Windows DesktopとProfessional 2019で確認しています
準拠モードを「はい」にしたら標準の規約に従うのかと思ったんですが変化なしでした

開発はWindowsでしつつもWindowsとLinuxどちらでもコンパイルできるようにしたいんですが
もしかしてそう簡単な話ではないんですかね
2019/10/18(金) 12:11:07.40ID:8CoI4J3v
>>481
visual studio cmakeプロジェクトでググる
2019/10/18(金) 15:49:49.04ID:/qIwU54Z
effective modern c++のnoexceptの項読んで思ったんだが、
C++の関数内でCの関数(具体的にはOpenGLとか)を呼び出した時に
C++側でcatchできる例外って具体的にどんなものがあるの?

試したことないけどmalloc失敗でbad_allocは飛ばないよね?
2019/10/18(金) 18:57:22.15ID:eJANlQqR
Windowsなら構造化例外とか
2019/10/18(金) 19:16:01.68ID:rTjJuJDg
>>482
cmakeってビルドに関するものだったような?
ソース自体はWindowsとLinuxで完全同一にしたいんですが
あれなんか自分勘違いしてるかな

とりあえずcmakeくぐります、有難う
2019/10/18(金) 19:19:00.58ID:5559SrY6
VCコンパイラがWindows専用だからcmakeだけでは解決しない
clangオプション使えばいけるんじゃね
2019/10/18(金) 19:27:02.65ID:BPo3Wxa0
cmakeってなんとなくしか使ってないんですけど何なんですか
OpenCVのソースをビルドするときに使いましたけど、cmakeした後にまたVisual Studioでコンパイルする必要があるのはなぜですか
2019/10/18(金) 21:38:24.25ID:1VxWd/yq
>>487
cmakeってmakeの代用じゃなくてmakefileとかxxx.slnとかを作るソフト
なのでcmake実行後に各々の環境にあったビルドを行う
2019/10/18(金) 22:32:33.72ID:HsDKWWc7
>>487
ビルドするためのスクリプトを作るツール、みたいに考えるといいよ
linux環境ならLinux用のものを作ってくれる
makeだと基本はlinux専用だし、.slnや.vcxprojはwindows専用だから、両方を面倒見るのは大変でしょ
490デフォルトの名無しさん
垢版 |
2019/10/18(金) 22:48:18.41ID:f2FG8XiO
ビルドするためのスクリプトを作るためのスクリプトを作るためのスクリプトなんてよくある話だよ。
2019/10/18(金) 22:49:57.04ID:a3uRi/Ig
秘伝のタレな
2019/10/18(金) 23:06:23.18ID:liCy40EB
GNU autotoolsをまともにいじる輩は消え去ったという現実をcmakeも味わうことになる。
バカは同じ間違いをする。歴史も見ずに。
2019/10/19(土) 00:19:02.04ID:JKxr+RAJ
CMakeってKitwareっていう大学発ベンチャーから出てきたやつだよな
もとはVTKとか可視化用ライブラリ開発してるしがないベンチャーだったのに
CMakeのおかげでやたら顔が知られるようになった
2019/10/19(土) 00:40:35.72ID:kiA3Djjo
VTKとparaviewの方が有名じゃなかったのか
2019/10/19(土) 00:44:42.31ID:JKxr+RAJ
ParaViewは最近になって有名になってるけど所詮はVTKのラッパーでしょ
CMakeのほうが影響度はでかいと思う
ベンチャーでここまでやれたなら大成功な事例だね
2019/10/19(土) 00:58:43.11ID:kiA3Djjo
cmakeより前から有名じゃね?
2019/10/19(土) 01:00:35.87ID:4XSJxZBk
cmake邪魔くさい
Makefile.am, configure.acからautoreconfしてconfigure作る方が楽。
windows用もmingwでクロスビルドしちゃえば楽だし。
WSLでwindowsからも見えるパスでビルドすると作ったwindows用binaryをすぐに起動できるしいうことなし
2019/10/19(土) 01:28:27.26ID:kDntEbbb
mingw使わずに標準のwindowsの環境で使えるようになってから出直してきて
2019/10/19(土) 01:36:12.28ID:+xsHXYvs
mesonいいぞー
2019/10/19(土) 01:37:16.21ID:JKxr+RAJ
makeとかのビルドツールって超重要なはずなのにおざなりな状況になってるのは不思議だ
なんとかしてくれ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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