X



C++相談室 part150

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

前スレ
C++相談室 part149
https://mevius.5ch.net/test/read.cgi/tech/1581974381/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://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/ (日本語)

テンプレここまで
0223デフォルトの名無しさん
垢版 |
2020/04/10(金) 06:35:52.26ID:+a3yzOMH
sort(
vecVisibilityPolygonPoints.begin(),
vecVisibilityPolygonPoints.end(),
[&](const tuple<float, float, float> &t1, const tuple<float, float, float> &t2)
{
return get<0>(t1) < get<0>(t2);
});
はt1の最初に設定されたfloatとt2の最初に設定されたfloatを比較して昇順に並べているのでしょうか?
[&]の意味はよく分からなくて教えて頂けると幸いです。
0224デフォルトの名無しさん
垢版 |
2020/04/10(金) 06:43:17.35ID:JXOjZTrq
そうですね。
&に何の意味があるのか僕にもわかりません。
0225デフォルトの名無しさん
垢版 |
2020/04/10(金) 07:08:42.52ID:j4px16+n
>>223
>t1の最初に設定されたfloatとt2の最初に設定されたfloatを比較して昇順に並べているのでしょうか?
その通りです。get<0>(t)でタプルの最初の要素を取り出して大小比較してます。
ちなみにget<0>を使わずに直接 t1 < t2 と比較すればタプルの左の要素から順に辞書順でsortされます。リンク先の(3)参照。
https://ja.cppreference.com/w/cpp/utility/tuple/operator_cmp

[&]はラムダ式の中で使われる外部の変数を参照で持ってくるものです。リンク先のラムダキャプチャを参照。
ただ上の例ではそもそも外部の変数を使っていないので[&]ではなく単に[]で問題ないです。
https://ja.cppreference.com/w/cpp/language/lambda
0226デフォルトの名無しさん
垢版 |
2020/04/10(金) 09:22:51.69ID:dM0rZx5j
>>217
当たり前はそうなんだが言語機能や標準ライブラリでそういうのを守りやすくしようぜって
流れは感じるけどね。
0227デフォルトの名無しさん
垢版 |
2020/04/10(金) 10:43:26.39ID:Ntz3fYqx
>>226
お前さんがそこで流れと言っているものは別に最近できた流れでもなく、昔からあったし随時拡充されてきているものだぞ。
0228デフォルトの名無しさん
垢版 |
2020/04/10(金) 11:08:46.24ID:JXOjZTrq
じゃあnewしたら負けって事で。
0229デフォルトの名無しさん
垢版 |
2020/04/10(金) 11:14:55.67ID:JXOjZTrq
僕も流れを感じますね。
このフォースを感じ取れないものもいるんですね。
少し驚きました。
0230デフォルトの名無しさん
垢版 |
2020/04/10(金) 11:17:22.22ID:nz1tlAhX
get<0> とか get<1> とか観るとげんなりする
なんで動的にアクセスできないんだ
0232はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/04/10(金) 11:23:39.14ID:n212JbcP
>>230
タプルはそれぞれの要素の型が違う可能性があるから仕方がないし、
array とかなら get を使わない選択肢があるんだから問題なくね?
0233デフォルトの名無しさん
垢版 |
2020/04/10(金) 11:27:18.78ID:JXOjZTrq
格納する値の型を知っているのに相称型でしかアクセスできないのは不便ではないかというご提案として、受け付けました。
進捗状況は、ご提案番号1として随時ご確認できます。

格納する値が実行時にしか確定しない以上、コンパイラが値の型にアクセスすることも出来ないんだよな。

std::variantのoperator==は荒業でアクセスしてるよね。
0234デフォルトの名無しさん
垢版 |
2020/04/10(金) 11:53:36.61ID:OfwBXl+o
あらかじめインデックス渡した関数テンプレートを実体化して
boost::anyみたいなものを返すという力技でどうにか出来なくもないだろうけど
上の方で何でもコンパイル時にやるのが良い事みたいに思ってるアホがいたけど
この辺の問題全く分かってないんだろうなぁ
(tupleを否定してるわけじゃないので変な噛み付き方しないように
0235デフォルトの名無しさん
垢版 |
2020/04/10(金) 12:15:49.17ID:GQp0hxvn
学術巨大掲示板群: アルファ・ラボ
ttp://x0000.net

物理学 化学 数学 生物学 天文学 地理地学
IT 電子 工学 国語 方言 言語学 など
0237デフォルトの名無しさん
垢版 |
2020/04/10(金) 12:33:52.04ID:JXOjZTrq
出来る限りコンパイル時に解決したほうが良いと思います。
0238デフォルトの名無しさん
垢版 |
2020/04/10(金) 12:37:34.37ID:JXOjZTrq
constexpr ifで実行時の条件分岐数を減らす。
これがいま話題の都会的プログラミング。
0239デフォルトの名無しさん
垢版 |
2020/04/10(金) 12:52:10.41ID:VwhukIlH
>>230
楽してコストを減らす工夫だよ
見た目がイヤなら横着しないで
ちゃんと意味がわかる名前を付けなさい
0240デフォルトの名無しさん
垢版 |
2020/04/10(金) 12:59:34.56ID:VwhukIlH
template < typename > union vector3 {
struct {
T x;
T y;
T z;
};
T[3];

T&operator[](int n);
const T& operator [](int n) const;
};
0241デフォルトの名無しさん
垢版 |
2020/04/10(金) 12:59:47.08ID:JXOjZTrq
定数に名前つけるのはどうだろか。
0243デフォルトの名無しさん
垢版 |
2020/04/10(金) 13:26:20.94ID:JXOjZTrq
フォースを感じ取るんだ。
0245デフォルトの名無しさん
垢版 |
2020/04/10(金) 14:25:31.83ID:JXOjZTrq
岡山は大都会。
0246デフォルトの名無しさん
垢版 |
2020/04/10(金) 15:17:20.24ID:C0/P2P/U
都会が優れていると思っている人を見ると、馬鹿なのかな、と思ってしまう。
0247デフォルトの名無しさん
垢版 |
2020/04/10(金) 16:06:17.50ID:JXOjZTrq
キミ良いこと言うね。
0248デフォルトの名無しさん
垢版 |
2020/04/10(金) 17:42:57.17ID:j4px16+n
タプルの分解は構造化束縛でだいぶ楽になったけど使わない変数を読み棄てる機能も欲しい
int main(){
  const std::tuple<std::string_view, int> person("nanashi", 35);
  const auto [name, age] = person;
  std::cout << "name:" << name << ", age:" << age << std::endl;
  return 0;
}
0249デフォルトの名無しさん
垢版 |
2020/04/10(金) 19:35:38.21ID:Ekk6JBhA
タプルなんて小規模のちょこっとしたプロトタイプコードのときは
楽だなんておもうけど、きちっとした巨大なコードに仕立て上げていく経過で
結局ふつうにちゃんと構造体なりを定義してそれ返すようにしないと後々
混乱しかないのが見えて結局こんなのイラネーな、ってなる
0250デフォルトの名無しさん
垢版 |
2020/04/10(金) 19:38:38.50ID:1+J64Tmd
都会つってもアーバンライフが理想だったりするんだよね
最先端とは言わなくても整った街並み統一された景観
中心部は新旧入り混じったごみ溜めみたいなもん

流行に飛びついてつまみ食いするだけのが最悪
0251デフォルトの名無しさん
垢版 |
2020/04/10(金) 19:48:45.27ID:JXOjZTrq
タプルはそういう風に使うものじゃないんだが。
0252デフォルトの名無しさん
垢版 |
2020/04/10(金) 19:50:40.96ID:nPD3giIX
タプルは雑多な多値を返したいときが本来の目的

メタプログラミングでも活躍するけど
0253デフォルトの名無しさん
垢版 |
2020/04/10(金) 19:54:34.60ID:JXOjZTrq
使い方のわからない初心者が要らないというが、必要ないなら標準に入るわけがない。
0255デフォルトの名無しさん
垢版 |
2020/04/10(金) 21:14:38.73ID:n33I9Qyf
>>225
ありがとうございます。
リンクと丁寧な説明、大変助かりました。
0256デフォルトの名無しさん
垢版 |
2020/04/10(金) 22:48:19.66ID:uiBwCqn7
タプルはどっちかというと無名クラスそのものな印象
なので>>249に1票を入れたい

さらに言うとC++ではラムダ式の引数にもポインタを渡せるし、
[&]で呼び出し元変数の書き換えもできるしで
ラムダ式との絡みでもタプルという機構はそこはかとなく重畳な印象
0257デフォルトの名無しさん
垢版 |
2020/04/10(金) 22:53:18.90ID:uiBwCqn7
ゼロコストのための手段の品揃えが良いのはいかにもC++だが
JavascriptやPythonに似せる方向性の努力はC++的では無い
キモス
0260デフォルトの名無しさん
垢版 |
2020/04/10(金) 23:07:46.16ID:uiBwCqn7
というのは半分は冗談で、
スレッド安全のために関数からはオブジェクトのコピーを返したいのだが
オブジェクトのクラスをいちいち定義したくない、と言う場合には多少便利
0261デフォルトの名無しさん
垢版 |
2020/04/10(金) 23:16:09.44ID:TvpFDEko
時代はjavascriptとPythonだからねー
キミたちより意識高いし「デキる」人多いよ
0263デフォルトの名無しさん
垢版 |
2020/04/11(土) 02:03:39.02ID:cUls8f/E
>>261
最近多いんだよねー
JavaScriptやPythonとかちょっとかじった程度で
「俺プログラマーやってます」って顔する子

最初の入り口が動的型付け言語なんだよね最近の子って
そんなもんじゃ使いものにならねっての
0264デフォルトの名無しさん
垢版 |
2020/04/11(土) 13:49:47.26ID:ksChGfzp
あほくさ
0266デフォルトの名無しさん
垢版 |
2020/04/11(土) 14:15:59.63ID:xAZRHMqH
アカネチャン
0267デフォルトの名無しさん
垢版 |
2020/04/11(土) 14:17:00.85ID:xAZRHMqH
でも、constexprの使い道もわからないようじゃC++の意味ないのでは。
豚に真珠。
0268デフォルトの名無しさん
垢版 |
2020/04/11(土) 14:20:49.27ID:P/JT/wuI
CひいてはC++の需要が無駄に高まってきてるのは、一つは競技プログラミングのため、もう一つはpythonのためだ
0269デフォルトの名無しさん
垢版 |
2020/04/11(土) 14:30:47.16ID:xAZRHMqH
競技プログラミングに何故C++を使うのか?
0272デフォルトの名無しさん
垢版 |
2020/04/11(土) 15:00:39.77ID:xAZRHMqH
>>270
らぶりーさまーちゃん。
0273デフォルトの名無しさん
垢版 |
2020/04/11(土) 15:38:18.09ID:XnsLNB9H
学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net

数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
0274デフォルトの名無しさん
垢版 |
2020/04/16(木) 13:35:18.13ID:VLcNbPWE
RTTIをプログラムの一部で使用した場合
使用していない部分でもRTTIを有効にしたデメリット(実行速度など)の影響を受けますか?
0278デフォルトの名無しさん
垢版 |
2020/04/17(金) 01:51:17.05ID:675DQ/0u
>>274
実行速度は実際に使うところにしか影響ないと思う。
バイナリサイズの面でのデメリットはRTTIを有効にしてコンパイルしてたら使わなくても発生すると思う。
0280デフォルトの名無しさん
垢版 |
2020/04/17(金) 12:21:47.73ID:ojp4wJFZ
C++の設計思想としては
Cで同じコードを書けば同じ速度、リソースで実行出来るのを目指している
で基本的には思想通りに仕上がってる
0281デフォルトの名無しさん
垢版 |
2020/04/18(土) 02:08:36.18ID:MF/MkUpw
関数形式のキャストってあるじゃん
int(a)みたいの

これのlong long版ってあるの?
スペースを含んでいるのだが(笑)
0282デフォルトの名無しさん
垢版 |
2020/04/18(土) 02:19:16.25ID:kdY61W0J
(long long)(x)
0283デフォルトの名無しさん
垢版 |
2020/04/18(土) 03:10:07.72ID:qNMUbfyc
>>282
実は、コンパイラからすれば、それは、旧来のC形式の
(型名)値
の形式のキャストとみなされている。
0284デフォルトの名無しさん
垢版 |
2020/04/18(土) 03:11:31.94ID:qNMUbfyc
>>283
(TYPE)x    // 原初的なCから存在していた旧来のキャスト形式
TYPE(x)    // C++ で追加された関数形式のキャスト
0289デフォルトの名無しさん
垢版 |
2020/04/18(土) 12:36:01.68ID:msudwh4N
関数形式のキャストって、キャスト演算子をオーバーロードするとき
間接的にしかお世話になってない希ガス、
旧来のキャスト形式に対して他になんかメリットあんの?
0291デフォルトの名無しさん
垢版 |
2020/04/18(土) 13:54:50.01ID:lQefZc9Y
>>289
コンストラクタとの一貫性を持たせることでtemplateを書くときに何か都合がいいとどこかで読んだ気がするが、うろ覚えなので間違ってたらスマン
0292デフォルトの名無しさん
垢版 |
2020/04/19(日) 19:48:59.49ID:/iMmv/v9
printfで標準出力に一行づつ出力するのが面倒なので、複数行をビアドキュメントで出力したいのですが、何か方法はありますか?
0293デフォルトの名無しさん
垢版 |
2020/04/19(日) 20:27:57.52ID:X1m2vVHB
>>292
printf(
"hhhh"
"jjjj"
"kkkk"
"llll"
);
0295デフォルトの名無しさん
垢版 |
2020/04/19(日) 23:27:06.24ID:/iMmv/v9
>>293,294

どちらも出来ました!
ありがとうございます。
0296デフォルトの名無しさん
垢版 |
2020/04/20(月) 10:40:59.97ID:gGVXVDIS
複数行ってそういう意味か?ω
出力は改行せんでええんか?ωωω
0297sage
垢版 |
2020/04/20(月) 14:01:38.37ID:H+0bMHyU
絶対に大丈夫なやり方は、こう :
printf(
 "xxxx\n"
 "xxxx\n"
);
0303はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/04/22(水) 14:11:59.93ID:x0z1Sb8H
>>300-301
スコープ無し列挙定数は全ての列挙子の値を表せる整数型が基底になる。
ただし、全ての列挙子の値が int か unsigned int に収まるならば int より大きくなることはない。
この場合は int で表せないのでもっと大きい型にしたいけど最大の整数型である long でも
表せないのでお手上げって言ってる。

codepad は gcc 4.1.2 を使ってる。
つまりその時点での最新仕様は C++03 で、C++03 には long long なんていう型はない。
long 型が最大の整数。
(実際には処理系の拡張として __int64_t という名前で 64bit 整数も使えたりはするんだけど、
enum 関連で使用されるようにはなってないっぽい。)
0304デフォルトの名無しさん
垢版 |
2020/04/22(水) 16:04:43.48ID:v2BILLR9
>>303
レスthx

clはデフォC++14なのでlong longがあるはずなのに
何でtest2がlong止まりなのって話

std::cout << typeid(test2).name() << std::endl;
とやってみても
enum `int __cdecl main(void)'::`2'::<unnamed-enum-test2>
となるだけでlongかどうかは確認できない

さらに
void func(int) { std::cout << "int" << std::endl; }
void func(long) { std::cout << "long" << std::endl; }
これだと出力がintになる
0305はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/04/22(水) 17:35:14.20ID:x0z1Sb8H
>>304
> clはデフォC++14なので
cl っていうと Common Lisp を連想してまう……というのは余談として、
それは動作環境を用意できてないからこっちで実行できへんのや。
結果が違うってのはどうなるの?
実行結果も示してくれへん?
あと 64bit 版か 32bit 版かも明示してや。

> longかどうかは確認できない
列挙型はあくまでも個別の列挙型であって整数ではないので、
基底型が何かというのは std::underlying_type で調べる必要がある。
0306はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/04/22(水) 17:39:14.29ID:x0z1Sb8H
godbolt で確認しようとしたら

LINK : fatal error LNK1104: cannot open file 'libcpmt.lib'

と出るんやが……
0307デフォルトの名無しさん
垢版 |
2020/04/22(水) 17:47:08.07ID:v2BILLR9
>>305
Visual Studioと言えば通じる?

underlying_typeか、こいつは情報ごっつぁん
std::cout << typeid(typename std::underlying_type<decltype(test2)>::type).name() << std::endl;
これの出力もintだった
0308はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/04/22(水) 18:05:31.28ID:x0z1Sb8H
>>307
> Visual Studioと言えば通じる?

コマンドが cl というのは知ってはいるんだけど、コンパイラの名前として cl っていうのは伝わり難いと思う。
マイクロソフトのドキュメントでは Microsoft C++ か MSVC という書き方をしていることが多いようなので、
たぶんそれが公式な呼び方なんじゃないかな。

> これの出力もintだった

値は何になってる?
0318デフォルトの名無しさん
垢版 |
2020/04/23(木) 14:02:24.26ID:GqVREd4h
あーすまん、ちゃんと見てなかった
2019でも起きるのに一年放置は長いな

型指定使えば済むやろ、で後回しにされてるのかも?
0319デフォルトの名無しさん
垢版 |
2020/04/23(木) 17:39:32.10ID:StmE//V5
だいたい出尽くした?
餃子さん情報2つもありがとう
リアルならバーでおごるところだ
0320デフォルトの名無しさん
垢版 |
2020/04/23(木) 17:56:49.02ID:HERx4kEF
本当は、64bit型が追加されたことはコンパイラ作者泣かせなんだ。
C++コンパイラはとても複雑になってしまっている上に新しい仕様が入ったことで組み合わせ爆発が起きて細かなバグが入り易い。
0321デフォルトの名無しさん
垢版 |
2020/04/23(木) 18:03:51.55ID:HERx4kEF
型の「昇格」や、2項演算子における型の「統一」も、64bit型が入ったことで複雑さが増した。
普段当たり前すぎて気にしないことだが、
unsigned char ch = 1;
と書いた場合でも、右辺は最初 int 型整数と解釈されるが、型にうるさいC++においても、それよりバイト数の少ない ch に警告も無く代入できてしまう。
他にも、
ch += 2;
とした場合、2は、最初int型と解釈されるのに、それよりバイト数の小さい ch に何の警告も無く足せてしまう。
これらで警告が出たらコーディングの手間がかかり過ぎるためそうなっているとは分かるが、型安全なC++においては背後にどういう仕組みがあるのかと思ってしまう。
0322デフォルトの名無しさん
垢版 |
2020/04/23(木) 18:07:51.10ID:HERx4kEF
>>321
unsigned char ch = 1 + 2;
と書いたとする。
右辺は、C言語の使用によれば、1も2もint型だとみなされてから計算され、
結果の3もint型である。普通、int i; に対して、
ch = i;
とすると当然エラーか警告が出るのに、
この場合には何もメッセージが出ずにコンパイラが通るはずだ。
これも背後にどの仕様が働いているのだろうか?
■ このスレッドは過去ログ倉庫に格納されています

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