C++相談室 part143

■ このスレッドは過去ログ倉庫に格納されています
2019/06/15(土) 13:51:53.57ID:DKQ0QQLH0
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

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

このスレもよろしくね。
【初心者歓迎】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/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvv:1000:512:----: EXT was configured
2019/07/05(金) 13:31:43.83ID:h+45fasi0

元々バイナリ肥大全く気にしないとかではないだろ
template使うとバイナリが必ず肥大するってのが大嘘なのよ
うまく使えばCよりユーザー側の負担を減らしたまま、バイナリサイズ減る方向に誘導出来る
ifdefのスイッチを型で分岐して自動指定するようなことが出来るからね
2019/07/05(金) 13:36:49.89ID:h+45fasi0
まあRAMが極端に少ない場合は、
大抵バイナリ肥大気にする前にRAMが枯渇してしまう

ROM浪費してまでRAM容量押さえる手段すらとることもあるし。
ループ回さず展開すればループ変数分のスタック消費は押さえられるみたいな奴
2019/07/05(金) 13:38:34.49ID:iD2vPqXr0
そうですか
どうでもいいですね
2019/07/05(金) 14:29:40.45ID:vxFjgZssM
多相アロケータとか組み込みに使えそうで期待してる
2019/07/05(金) 19:29:27.74ID:cg54bwGhM
>>698
どう変わってるの?
ちょっと説明してみ
2019/07/05(金) 22:54:57.76ID:v6DHhGs90
なおc++を使うことで増えるバイナリ肥大化は考慮しなくて良いものとする。
みたいなクソ意見。
2019/07/05(金) 23:06:22.44ID:RqC4v1rZM
PCなら考慮しなくていいしプアな環境ならスタートアップルーチン削りまでする場合もあるし
環境書かなきゃクソも何もないわ
2019/07/05(金) 23:23:06.20ID:RI4o57M10
>>704は、>>675の2行目を認識すべき

例:RX600シリーヅとか、ROMが2GBもあるのにRAMが128KBしかないのがあるし、
2019/07/05(金) 23:35:12.09ID:RI4o57M10
よく見たら2 MBやったorz
まあRAMは多いほうが良い
コードもRAMに置いた方が速いしimmutableなプログラミングもしやすいし、、
2019/07/06(土) 00:24:21.88ID:Cx3pk18b0
ramよりromの方がだいたい安価
電源が不安定でも一定の動作の保証がほしい
OS無いんで電源投入時の処理から自前で実装
そもそもそこまで速度重視しない

組み込みだとこういう環境があるんすよ
技術的には枯れた世界かもしれんが
2019/07/06(土) 02:13:02.83ID:2DlqEmd30
stringからstd::chrono::secondsへ変換するにはどうしたらよいですか??????????
2019/07/06(土) 02:18:48.19ID:QpY/QUgO0
auto sec=std::chrono::seconds(std::stoi(s));
2019/07/06(土) 02:23:42.88ID:2DlqEmd30
atoiだとオーバーフローする場合がありませんか?
2019/07/06(土) 02:42:12.32ID:F4bvg3qDd
タイヤに空気入れると破裂しませんか?
713デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/06(土) 08:21:27.31ID:UHbZjDbS0
ディグダグのROMは何キロバイトですか?
2019/07/06(土) 10:43:54.53ID:YCbxVHxg0
stoullにしなさい
時間はintで扱っちゃあかん
あの日までもう20年切ってるんだ
2019/07/07(日) 00:31:17.33ID:t8N8shlC0
↑誰か曲を付けよう
2019/07/07(日) 00:41:38.39ID:04ONxsyD0
いいかい、学生さん、トンカツをな、トンカツをいつでも食えるくらいになりなよ。
2019/07/07(日) 01:15:25.86ID:t8N8shlC0
>>335の続き。
目的は一応達成できていたものの、偶然に頼りすぎたきらいのある>>333式の解決策の改善を試みたが、
やっぱテンプレートだけでは済まず、関数のオーバーロードも援用しなければ(意図した記述量では)実現できなかった、

・ 関数テンプレートの部分特殊化をやらないと、
  tr_pos<Foo, *>()、tr_pos<Bar, *>()、tr_pos<*, Foo>()、tr_pos<*, Foo>() (*=A, B, C, D, ...)
  の特殊化を総当りで書く必要があり全然省力化にならない
  (A, B, C, ...は1兆個ぐらいあるから、ほとんどコピペとはいえ4兆個のテンプレートの定義を書く必要が出てくる

・ というわけで、クラステンプレートを経由する例のやり方で関数テンプレートの部分特殊化はやった

・ 結局、テンプレートの名前解決規則ではコンパイラが名前を解決できなくなるものとして以下の4ケースが残った。
  tr_pos<Foo, Bar>(), tr_pos<Foo, Foo>(), tr_pos<Bar, Foo>, tr_pos<Bar, Bar>()
  こいつらは関数のオーバーロードで特殊化でおk

・ スフィ姉は未調査

いじょ
2019/07/07(日) 01:22:19.64ID:t8N8shlC0
なおFooやBarにset()やget()のメソッドを追加してA, B, C, ...と共通にtr_pos()できるようにする案はパフォーマンス上の問題で論外なのでもともと却下
(set()やget()の追加は出し入れするデータの型としてintermediateなクラスWの存在を仮定しているが、FooやBarとWとの間の変換は極めて重い処理となる
2019/07/07(日) 09:11:52.62ID:SNWX9Bjla
>>718
Foo->Bar
Bar->Foo
Foo->Foo
Bar->Bar
この四つの操作は共通?
2019/07/07(日) 12:23:18.94ID:t8N8shlC0
>>719
共通ではありません
Foo->Bar、Bar->Fooは互いに他方の逆関数なので別
Foo->Foo、Bar->Barはそれぞれのコピコンを呼ぶように(今週から)しますた、

なお、先週は変換元インスタンスをx、変換先インスタンスをy、intermediateなクラスWをaとして、
 inline void tr_pos(.const (変換元クラス).& x, (変換後クラス)& y) { tr_pos(x, a); tr_pos(a, y); }
とか書いていたので、上記4者は「表記上は」共通操作に見えるコードだったが
今週からはその共通性も無くなり申した、
721デフォルトの名無しさん (アウウィフ)
垢版 |
2019/07/07(日) 12:29:05.93ID:L+nDH+YyF
>>715
https://www.youtube.com/watch?v=W8C5Za4_4j4
2019/07/07(日) 22:04:14.86ID:SWnsKia6a
なんでC++で備えてる通信関係のインターフェースがソケット止まりなの
2019/07/07(日) 22:10:23.25ID:rayzKf1F0
需要がないから
2019/07/07(日) 22:26:16.63ID:2F5duMK20
少なくとも高レイヤのライブラリが標準で提供されることは今のところないな
2019/07/07(日) 22:50:37.10ID:gRf2diQc0
networking-TSで<net>を検討中だよ
C++20にはまだ入らなそうだけど
2019/07/07(日) 23:00:04.50ID:yY7Z+zin0
無数にライブラリがあるじゃん
2019/07/09(火) 16:24:18.39ID:810tT4wer
string で任意制度の整数とか浮動小数点数を実装した信頼されてるやつない?

コピペで済むようなやつ!
2019/07/09(火) 16:32:51.09ID:uGZEPt9ja
文字列から数値への変換で精度求めるのは設計が間違っているのでは?
2019/07/09(火) 16:42:32.66ID:VtjrtSEDM
COBOLのゾーン十進数みたいなやつ?
ネタとしては面白そうだな
2019/07/09(火) 16:46:10.73ID:zjLFaLyy0
任意精度じゃないけどこういうのじゃダメ?
Gooooogle様が作ってるdouble-conversionっていうやつ
https://github.com/google/double-conversion
2019/07/09(火) 16:53:49.80ID:zjLFaLyy0
変換が望みではなかったか
2019/07/09(火) 20:59:34.72ID:5DOcmAvj0
if( auto a = f() ){}
ってのが便利でよく使ってんだが
2変数になった場合はどう書けばよい?
if( auto a = f() && auto b = g() ){}
って書いたらコンパイラに怒られた
2019/07/09(火) 21:10:59.22ID:ZHNSssOw0
fowrad_as_tupleして構造化束縛?カンマで行けるかな
2019/07/09(火) 21:38:25.16ID:t5qNdO7w0
if( auto a = f() && g() ){}
2019/07/09(火) 21:38:44.04ID:t5qNdO7w0
if( auto a = f() & g() ){}
2019/07/09(火) 21:51:32.92ID:E5vjkFcA0
//c++17
bool f() {
return true;
}
bool g() {
return true;
}

int main(void) {
if (auto a = f(); auto b = g() && a) {
std::cout << "True" << std::endl;
}
return 0;
}
2019/07/09(火) 21:54:10.28ID:5DOcmAvj0
おお、しかしそれ
if( auto a = f() )
if( auto b = g() )
{
}
ってぶら下がり文で書いた方がマシ・・・
2019/07/09(火) 21:57:13.33ID:E5vjkFcA0
これでいいか
if (auto [a,b] = std::make_tuple(f(), g()); a && b) {
}
2019/07/09(火) 22:12:00.87ID:pkZ4t/JR0
short circuitが使えないのが痛い
結局if2つに分けて書いた方がましと言うことに
2019/07/09(火) 22:27:33.86ID:td6qAd7k0
簡潔に表記しようとしてかえって素で書くより煩雑になってたら本末転倒だね
741デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/09(火) 22:29:17.74ID:JhNoJX2l0
operator boolをa&&bの結果でoverrideしたpairを返す関数作って引数に実行対象の関数渡すのはダメか
2019/07/09(火) 22:43:40.47ID:11PXPZRU0
cobol風ならこんなのが有るよ
https://github.com/vpiotr/decimal_for_cpp

それと上で話になってるautoのループについて横槍で聞きたいんだけど
ちょっと変わったことしようとすると
どう分解?すればいいのか解らなくて
autoを上手く元の形に戻すコツみたいなものか
それを解説しているサイトとか有ったら教えてくだされ
2019/07/09(火) 22:52:20.35ID:qZOKZ1zLa
>>742
何が知りたい?
2019/07/09(火) 23:08:48.39ID:kBXtWzHg0
>>739
そもそも短絡評価使えたら
if(auto a = f() || auto b = g()){
って書くとf()がtrueならbがない状態でブロックに入ることになるし…
2019/07/10(水) 00:37:30.64ID:CjBjj/SJ0
>>744
もともと質問者があげていた&&のケースについての議論だから短絡評価で問題ないでしょ
2019/07/10(水) 00:45:23.28ID:kYtVBUtkM
>>745
どっちかは使えない非対称な仕様なんていややわー
2019/07/10(水) 05:17:16.10ID:BNPBqUg0M
>>745
応用力なさすぎ
if( auto a = f() && auto b = g() ){
} else {
// f() が false 返したら b がない状態で来る
// まあ変数は作っておいて不定にしちゃうと言うのもありかもしれないけど…
}
2019/07/10(水) 07:45:11.92ID:IKBgPxAr0
&&のオーバーロードで死ぬコードやん
2019/07/10(水) 08:00:59.47ID:brNiC0jH0
てかそこまでして変数宣言をif文に入れる必要なくね?
2019/07/10(水) 10:10:53.73ID:BYC+2ije0
いやでもweak_ptrとか
2019/07/10(水) 11:27:22.84ID:OXvWQFj60
{

}
でくくれ
2019/07/10(水) 12:16:47.27ID:Y7REIpqsM
ぐぐれ
に空目してそんなの無理だろと思った
2019/07/10(水) 12:34:32.89ID:R0s9iXV+M
テンプレート使ってなにかしたいけど、何を作ればいいのか思いつかない
車輪の再開発でおすすめのある?
2019/07/10(水) 14:44:49.38ID:rP/FdQrfd
行列クラスでも作ってみれば?
データ型とサイズをテンプレートパラメータにして
2019/07/10(水) 16:49:22.22ID:NolX0ibb0
>>743
そうですね
具体的にどういう事がしたい
というのは無いんですけど

リンクに書いた
https://github.com/vpiotr/decimal_for_cpp
これも使用例にはautoループを使ったものが有るんですけど
それを見ていて
そういえばautoループで書いてある物をc++03風?で書くにはどうすればいいんだろうか?
って疑問に思って調べたんんですけど
その時に特にこれといった物が見付らなくて
諦めたんですけど
ここで上に有るcobol風数値の話とautoの話の流れを見ていて
急に思い出して
何か知っている人がいそうだなと思って
何となく質問してみた次第
具体例をあえて言えば
このcobol風の物の使用例のautoループを何と言うか普通に戻すには
どういう風に考えていけば良いのだろうか?
その考え方や手順が解ればいいなと
そんな疑問を持って書かせて貰った次第です
かなり漠然とした疑問
という程度です
2019/07/10(水) 17:10:50.06ID:dvhbJ9iGa
https://cpprefjp.github.io/lang/cpp11/range_based_for.html
2019/07/10(水) 19:43:28.78ID:h7pwbJEr0
type_traitsヘッダ再実装
2019/07/10(水) 20:09:02.22ID:PyTD27+8M
autoループって何?
759デフォルトの名無しさん (アウアウウー)
垢版 |
2019/07/10(水) 20:22:30.91ID:/yjxFivUa
range-based forの事を指していると思われる。
for(auto&& v: vec){
//vについての処理
}
2019/07/10(水) 20:25:53.09ID:hIMxNPLy0
>>753
文字列やら数値やら与えて文字列にする関数を作った。
f("1+1=",1+1,string("ですよねー"))
みたいなの。
可変引数テンプレートやらtype traitsやら機能いろいろ使うことになるからいい練習になる。
2019/07/10(水) 20:27:41.92ID:mLQ0O0GxM
完璧なprintfクローンをテンプレートで作る
俺は挫折した
2019/07/10(水) 21:19:19.86ID:/Irjr7BN0
gcc, g++9.1
2019/07/10(水) 21:21:05.72ID:/Irjr7BN0
>>762
途中で書き込んでしまったすまない
gcc g++ 9.1だと

for_each_n(InputIterator first, Size n,Function f)が定義されてなくて
for_each_n(ExecutionPolicy&& exec, InputIterator first, Size n,Function f)のみ定義されてるんだけど
2019/07/10(水) 22:31:22.11ID:IKBgPxAr0
おめえの汚ねえテンプレート実装なんてオラ使いたくねぇ
2019/07/10(水) 23:04:21.40ID:ddYZk9I40
>>761のまねしてprintf作ろうと頑張ってみたところ。
std::to_string()にstd::stringをスルーする関数と、char[]からstd::stringに変換する関数が欲しくなった。

https://ideone.com/8RUAQh
2019/07/10(水) 23:26:51.16ID:dtMqcxnO0
>>754
ありがとう
やってみる
>>760 
ありがとう
難しそうだけどやってみます
2019/07/10(水) 23:33:46.92ID:ddYZk9I40
std::string to_string(const std::string_view& In) {
return In.data();
}

こういう関数ほしいほしいほしい。ばいきんまん。とってきて
2019/07/11(木) 00:08:50.79ID:1bNokJon0
テンプレートのエラーってめちゃくちゃでわけわからんです
あれで嫌いになるC++初心者多いのでは?
AIみたいなのが優しく教えてくれればいいのに
2019/07/11(木) 00:09:04.21ID:+eNm2iJo0
https://ideone.com/bFsq3d
適当にいじってみたところ、動かなくもない感じ。@C++17
2019/07/11(木) 00:10:14.28ID:+eNm2iJo0
>>768
コンセプトが入ったら、いろいろ解決するとは言われている。
VCの場合は、一番上のヤツを察して修正していくといつか終わる。
途中のエラーを察するより楽。
2019/07/11(木) 00:20:00.77ID:pODzikO+0
主要3コンパイラともとりあえず1番上のエラー付近を調べればいいから分からんということもない
稀に本当に無関係なエラー出てることもあるけど
2019/07/11(木) 01:06:51.67ID:wg5f1lI10
エラーの読み方を知っちゃえば面倒くさいだけでどうということもない
ただ、これと間違えたんじゃないの、っての候補表示がかえって混乱をさそってる感はある
2019/07/11(木) 01:54:45.72ID:PMWvbDa10
C++ は perl にまけずおとらず読みにくい
というのは誤解でしょうか?
2019/07/11(木) 02:09:28.69ID:TZ7Ijk3p0
書き方しだい
2019/07/11(木) 02:40:24.86ID:Kuyk/Ifa0
>>773
C++は型がある分ちょっとマシ
2019/07/11(木) 08:50:22.94ID:PMWvbDa10
ありがとうございました
早さが必要なのに、C できつくなったら
ストラウストラップ本
というのを買ってスタートしてみようかなと思ってました

初めるときは、少しでも読めるように気合いれておきます
2019/07/11(木) 17:19:21.71ID:HcmCiWg70
756さんどうもです
読み込んでみます
2019/07/11(木) 18:59:11.77ID:eLSvbx+Sa
自分で定義したコピーコンストラクタからデフォルトのコピーコンストラクタを呼ぶ方法はありませんか?

C(const C& c){
//デフォルトのコピーコンストラクタを使って静的にメンバをコピーしたい
//その後にポインタの参照先を修正したい
}
2019/07/11(木) 19:26:34.40ID:ryNigZ+S0
データメンバー分離すればいいんじゃない

class C
{
 struct Data { /*...*/ } data;

 C(const C& c)
 : data(c.data) // C::Dataのデフォルトコピコン
 {
  // やりたい処理
 }
};
2019/07/11(木) 21:59:39.17ID:t9WNsdfx0
>>778
自分で定義した時点でコピーコンストラクタはそれしか存在しないから無理
>>779みたいな方法なり全部自分でコピー書くなりするしかない
781デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/12(金) 19:18:07.56ID:l82xLe+v0
ムーブコンストラクタとコピーコンストラクタ両方作って保守するのも
完全転送とsfinae用意するのもどちらも面倒臭いんですがc++erの皆様はどのように対象しているのでしょうか
2019/07/12(金) 20:04:43.42ID:rLvHx2BM0
基本的に全部unique_ptrとdefaultのムーブコピーに任せてる
大抵はそれで困らないし困ったらその時考える
2019/07/12(金) 21:54:46.19ID:hdEhfFLPa
>>779-780
ありがとうございます
とりあえずデータメンバを構造体にまとめることでなんとかなりそうです
2019/07/12(金) 22:51:40.54ID:Bn8x2zNm0
暗黙のコンストラクタに任せるとか一番の事故パターンじゃん
2019/07/12(金) 23:06:47.15ID:I2Ktnv+c0
3/5/0のルール
https://ja.cppreference.com/w/cpp/language/rule_of_three
2019/07/13(土) 02:39:27.85ID:6MHTVTJ70
最近のC++(少なくとも11以降?)ならば、マクロの使用は悪と決めつけてOKなもんですか?
それとも未だにマクロの役立つシーンはあったりするんですか?
2019/07/13(土) 02:46:19.08ID:kRrXltov0
普通に使ってる
ただ代替がある機能についてはわざわざ使わない
2019/07/13(土) 02:46:46.90ID:rtc9CxCA0
あるよ
2019/07/13(土) 03:27:27.54ID:WqGPp55Y0
>>786
template classをいくつかの型で特殊化しておきたいときとか

型の名前を静的に調べる - 凹みTips
http://tips.hecomi.com/entry/20110321/1300691095?amp=1
2019/07/13(土) 07:14:17.28ID:4+1a5dQe0
>>786
バカが書いたテンプレートよりもlinuxにあるマクロを使った方がマシ。
てか可読性落としてまで型安全とかにこだわる必要なし。
2019/07/13(土) 09:10:55.61ID:2OenGlWi0
>>786
互換性のない複数プラットフォームに対応しようとするとき
ヘッダーファイルをincludeするかどうかを切り替えたいとき
ヘッダーファイルをincludeしたかどうかでプログラムの動作を切り替えたいとき

なんかは素直にマクロ使った方がいいと思う。
moduleが導入されれば、この辺の組み方も大幅に変わってくるかもしれないけど。
2019/07/13(土) 10:07:13.95ID:TPR8jqd00
コピコンを定義を求められるときは大概代入演算子も定義するから
コピコンの中身を代入演算子の方に移して
コピコンは代入演算子を呼べば良い
2019/07/13(土) 10:56:21.38ID:TPR8jqd00
真の原因がバカにあるのだとすれば、可読性向上を唱えても空しい
2019/07/13(土) 11:59:42.51ID:K15oVfEY0
>>791
#ifdef とかの話?
それをマクロと言うかどうかは微妙な気がするけど
2019/07/13(土) 12:24:56.92ID:N59vWAWf0
#include しゃあない
#pragma しゃあない
#line まあしゃあない
#if系 ある程度しゃあないけどテンプレートやconstexprへの置き換え考えようね
__VA_ARGS__ 可変長引数テンプレート使えと言いたいところだけど場合によるのかな
#error static_assert使え
定数#define const変数使え
関数#define ##や__VA_ARGS__使うためならしゃあない。そうでないなら死ね
2019/07/13(土) 12:28:53.30ID:rtc9CxCA0
マクロって#defineだけだろ?

あと
> 定数#define const変数使え
constexpr auto 使え
797デフォルトの名無しさん (スップ)
垢版 |
2019/07/13(土) 16:14:29.97ID:wshCTlzmd
includeもC++20で死ねって言われるようになるの?
2019/07/13(土) 17:22:17.35ID:pw3rXvVP0
>>786
○○は悪、とかドヤ顔で言ったり書いたりしてるやつは例外なくアホだと思っていい
2019/07/13(土) 21:44:17.10ID:2KEsM2Co0
マクロの定数(リテラルの定数)とconst/constexprって等価じゃないよね?
実用上はさておき
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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