X



C++相談室 part145
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
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/ (日本語)

----- テンプレ ここまで -----
0382デフォルトの名無しさん
垢版 |
2019/10/06(日) 10:28:58.03ID:yc9LKsYB
>>380
マルチ禁止
0384デフォルトの名無しさん
垢版 |
2019/10/07(月) 19:17:43.20ID:PHxdOQnu
C++ってなんでヘッダファイルいるんですか
最近マシン早いんだし
全部ソースに書いてインポートすればいいのに
0387デフォルトの名無しさん
垢版 |
2019/10/07(月) 20:58:42.59ID:A3KSW75p
>>384
むしろソースがいらなくて全部ヘッダに書けばいい
inline変数とかもできるようになったことだし
0390デフォルトの名無しさん
垢版 |
2019/10/08(火) 09:06:39.07ID:xr4jQIWZ
プリコンパイルヘッダーって使ってます?

使っているプロジェクト見たことないですわ。
0394デフォルトの名無しさん
垢版 |
2019/10/08(火) 21:42:59.95ID:lGNioH0G
headerオンリーってのは可搬性に優れた良いものだろ
特にテンプレート多用している奴は、一部関数だけソースファイル分離する意味が薄い
0396デフォルトの名無しさん
垢版 |
2019/10/08(火) 21:54:07.26ID:J87hrB1p
「全部ヘッダ」と言われると、そのときの「ヘッダ」の定義がどういうものなのか気になる。
0398デフォルトの名無しさん
垢版 |
2019/10/08(火) 22:09:52.63ID:tSj7di+z
>>390
VCのやつは使いまくり
依存するライブラリのヘッダファイルを標準のやつもソリューション内のやつも全部まとめて
stdafx.hの中でインクルードしたらことのほか便利
ただし同じプロジェクトのヘッダファイルを入れだしたら目的を見失って氏ぬ
0399デフォルトの名無しさん
垢版 |
2019/10/08(火) 22:10:50.35ID:hpLG4xMo
テンプレート関数は便利だしconstexpr関数は市民の義務だし
結局ほとんどヘッダファイルに書くことになるでしょ
0400デフォルトの名無しさん
垢版 |
2019/10/08(火) 22:30:34.35ID:X4FGjRpd
初心者ですが質問させてください

print(1, 3.14, "abc");とやると引数の中身を順番にスペース区切りで出力してくれるような関数は
可変引数テンプレートの再帰呼出しを使うと便利にできることを知りました。
そこで引数の型に応じて出力の見た目を少し変えたいのですが、
関数の特殊化をすればいいですか?
typeidだと動的な評価になってしまうんですよね?
0401デフォルトの名無しさん
垢版 |
2019/10/08(火) 22:33:59.15ID:kGAGzuS0
予想通りの馬鹿回答で笑ってしまった。
やっぱいい判別になるわテンプレバカ。
0402蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/10/08(火) 22:37:33.87ID:jfG+k1ni
>>400
引数一つに対するテンプレート関数を作って特殊化してそれに少しずつ渡せばできるよ。
0405デフォルトの名無しさん
垢版 |
2019/10/08(火) 23:04:05.43ID:/kdim2Vo
こんな雑談スレ好きな奴以外に需要ないだろ
こんな辺境別に見なくて良いんだよ?
0407デフォルトの名無しさん
垢版 |
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;
}
0408デフォルトの名無しさん
垢版 |
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...);
}
0409デフォルトの名無しさん
垢版 |
2019/10/09(水) 04:21:52.30ID:NmoqHfbB
>>406
いわゆる型特性というやつでしょうか?enable_ifを使うのかと思い試したもののうまくいかず、
ネットで調べるとenable_ifと可変引数テンプレートは相性が悪いという意見を見つけたり...
0410デフォルトの名無しさん
垢版 |
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...);
}
}
0411デフォルトの名無しさん
垢版 |
2019/10/09(水) 10:59:59.89ID:RbUf+g7C
const char * 自体も class First や class Args と一致するんじゃね
0412デフォルトの名無しさん
垢版 |
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), ...);
}
0413デフォルトの名無しさん
垢版 |
2019/10/09(水) 22:42:32.58ID:J+0BhmRu
win系のOSの画面に1.txt~5.txtがあります。1.txtと2.txtをドラッグして選択したとします。
この状態で3.txt~5.txtを選択したことにするにはどのようなコードを書けば良いですか?
0417デフォルトの名無しさん
垢版 |
2019/10/11(金) 01:40:25.90ID:n351RXRL
std::shared_ptrを構築後に(カスタム)デリータを変更するのは無理?

既にどっかで作成済みのshared_ptrについて、破棄タイミングを後から見れないかなと
0420デフォルトの名無しさん
垢版 |
2019/10/11(金) 12:29:56.77ID:w5dDNHMJ
VCのlatestでchar8_tが入ってたわ
やっとC++erが文字コード問題から解放されるんだな
0422デフォルトの名無しさん
垢版 |
2019/10/11(金) 15:19:50.16ID:iqVlf+4W
>>418
デリータごとswapされたわ
stackoverflowにも似たような質問があったけど結論としては出来ないっぽい
たぶん
0425デフォルトの名無しさん
垢版 |
2019/10/12(土) 08:08:31.86ID:vgsPsMOm
>>423
C++ユーザが全員趣味なんてどこにも書いてないし、あるプログラミング言語が趣味でしか使われてない状況なら、委員会なんていらないわwww
0426デフォルトの名無しさん
垢版 |
2019/10/12(土) 08:48:46.65ID:fl5cgmi7
衣食住の確保以外の仕事なんてみんな趣味みたいなもんだよ
なくたって構わんのだから
0429デフォルトの名無しさん
垢版 |
2019/10/12(土) 09:06:03.19ID:w6XAfbR5
委員会なんて何の役にもたってねーだろ。
構文解析もまともに理解できてないバカが俺様仕様の理想に突っ走ってるだけのクソ組織で、
仕様の実装、デバッグの手間なんてこれっぽっちも考えてないのがよくわかる。
0431デフォルトの名無しさん
垢版 |
2019/10/12(土) 09:54:19.46ID:DT43rpFP
近年は新機能は三大コンパイラ(GCC,MSVC,Clang)での試験実装が入ってから仕様入りするのが普通になってるし
コンセプトなんてまさにデバッグの手間の軽減を第一目的に苦心して作られた機能なんだけど
どのへんを見てよくわかったのか教えて
0432デフォルトの名無しさん
垢版 |
2019/10/12(土) 10:00:51.19ID:w6XAfbR5
>>431
実装したことないやつは黙っててね。
で、そのコンセプトを実際のコードでコンパイルした時間がどれくらいになるかわかってる?
そういう有用なベンチマークもほとんど出さずに無理やり入れようとするから
信頼を無くしてるんだよ。
0433デフォルトの名無しさん
垢版 |
2019/10/12(土) 10:19:47.03ID:Nq/Z/R6A
経験したことは全て正しいっていう日本特有のアホ理論だろそれ
経験してないお前に発言権は無い、っていう
その理屈を持ち出すヤツは大抵はアホ
0434デフォルトの名無しさん
垢版 |
2019/10/12(土) 10:24:58.21ID:69fBrMS4
コンパイル時間は、コンパイラの出力する最適化されたバイナリの実行速度に比べたら問題ではないだろ

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

std visitで引数増やすとコンパイル時間は簡単に増やせるよ。
5つくらいでもうコンパイラが落ちたりする
やらせていることの面倒くささ、それを手書きすることを考えれば妥当なのだけど
0441デフォルトの名無しさん
垢版 |
2019/10/12(土) 12:41:57.75ID:Tqr7IA/6
最近C++触ってないけど数万程度で10分もかかるの?
10万行程度なら5分以内に終わってほしいところだけど…
0442デフォルトの名無しさん
垢版 |
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秒以下でコンパイルできます。
0445デフォルトの名無しさん
垢版 |
2019/10/12(土) 15:33:32.46ID:UCFxfzGx
ヘッダオンリーのライブラリがポータブルとか言われてもてはやされるのがc++だからね
生産性の意識が間違った方向に向いてる
コンセプトでどうなることやら
0446デフォルトの名無しさん
垢版 |
2019/10/12(土) 15:52:13.73ID:K75UXpIa
俺の10万行程度のアプリは1分以内にコンパイル終わるが・・・
10分てどこの世界だ
0447デフォルトの名無しさん
垢版 |
2019/10/12(土) 19:26:26.29ID:8VsKOlOD
「参照の配列」を作りたいときって現状 reference_wrapper を使う以外ないですか?
0449デフォルトの名無しさん
垢版 |
2019/10/12(土) 20:55:57.96ID:cS98TRHZ
>>437
プリコンパイルヘッダー使え…!

>>446
VC++2010の場合配列要素のアドレスの配列というのを
それぞれ1万行ぐらい書いてリリースビルドすると10分かかる
0450デフォルトの名無しさん
垢版 |
2019/10/12(土) 23:18:34.83ID:zNYGVDyE
spiritで構文解析させてたコード(その上et使った自作ライブラリあり)だから例として極端だったかもしれんけどね
プリコンパイルドヘッダは使ってたよ
効いてるときは数分かからなかったと思う
というか5年以上そのコード使ってないんで今のマシンならまだマシになるとは思う
0451デフォルトの名無しさん
垢版 |
2019/10/13(日) 01:04:01.79ID:2Ilco01g
boostを多用した10数万行のソースでprecompileありでreleaseビルドしたら10分くらいかかってたけど、debugビルドでは1,2分くらいだった気がする。パースだけなら大したことないけど最適化がかなり遅いと思われる。
0454デフォルトの名無しさん
垢版 |
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とかで検索しても上手く引っ掛からないみたい(有るには有るけど少ない)
0457デフォルトの名無しさん
垢版 |
2019/10/13(日) 17:23:21.82ID:Y0ptPfKA
他の言語で書かれたコードをスクリプトの要領で
C++から呼び出して実行したいのですが、
そういった事をするのに適した言語ってどういった物があるのでしょうか?
0465デフォルトの名無しさん
垢版 |
2019/10/13(日) 20:24:22.36ID:kfwaB+Y7
>455,456さんどうもです

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

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

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

どうもでした
0466デフォルトの名無しさん
垢版 |
2019/10/14(月) 15:05:53.73ID:rfaLGQBa
template<size_t N>
class Test{
public:
private:
int m[N];
};

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

こういう場合のコンストラクタの書き方ってどうすればいいのでしよう?
可変引数?
0469デフォルトの名無しさん
垢版 |
2019/10/14(月) 15:28:00.19ID:qN7fFVrS
>>466
そもそも、そのような生配列は、デフォルトでは0初期化もされないので、
メンバ初期化子リストを使わなくても効率は落ちないので、
コンストラクタ内部で普通に代入演算子を使って初期化すればいい。
すると、単に任意個数の引数をコンストラクタに渡す問題になる。
それには、昔ながらの va_list を使って渡す方法と、
関数テンプレートやテンプレートクラスを使って、自分自身を一つずつ引数を
減らしながら呼び出していく方法の二通りある。
0471デフォルトの名無しさん
垢版 |
2019/10/14(月) 15:30:45.59ID:rfaLGQBa
>>469

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

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

templateの可変引数の為にどんな型でも一致してしまい、そのくせにdoubleからintなどの変換をしてくれないのでinitializer_listを引数に出来たり、もしくはもっといい初期化方法があるのかなと思った次第です。
0473デフォルトの名無しさん
垢版 |
2019/10/14(月) 16:48:34.42ID:REdvl5Gt
>>471
>そのくせにdoubleからintなどの変換をしてくれないので
この点に関しては、以下の拡張展開でいけるはず。
template<typename... T>
 Test(T... args):m{((int)args)...}{
}
0474デフォルトの名無しさん
垢版 |
2019/10/14(月) 16:55:25.15ID:REdvl5Gt
templateの「非型引数」を使えば、理論上は、
template<int...args>
Test(int...args):m{args...}{
}
と書ける可能性はあるかもしれないけど、試してみてないので分からない。
0475デフォルトの名無しさん
垢版 |
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.
0476デフォルトの名無しさん
垢版 |
2019/10/14(月) 17:48:47.38ID:DdI7aqm2
>>466
要素数がコンパイル時に決まってるなら std::array 使って Test<3> x{{1,2,3}} とすることは簡単にできそう。
0477デフォルトの名無しさん
垢版 |
2019/10/14(月) 20:20:29.10ID:ljIrzJ7B
>>464 >>457
tcl + 1
0478デフォルトの名無しさん
垢版 |
2019/10/16(水) 00:49:52.16ID:4OT/K/L6
>>473 Thank you!!
0479デフォルトの名無しさん
垢版 |
2019/10/18(金) 03:20:02.11ID:kbBE7aSe
他クラスのメンバ関数テンプレートを呼び出すときってtemplateキーワードを関数名の前に付けないと
operator<と間違われてエラーになりますですよね?具体的に例をあげてみますと

https://wandbox.org/permlink/F7zl1fDh3qc216hd

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

開発はWindowsでしつつもWindowsとLinuxどちらでもコンパイルできるようにしたいんですが
もしかしてそう簡単な話ではないんですかね
■ このスレッドは過去ログ倉庫に格納されています

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