C++相談室 part140

■ このスレッドは過去ログ倉庫に格納されています
2019/01/13(日) 05:56:22.70ID:9RrR7Arz
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/

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

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

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

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2019/02/02(土) 00:15:52.64ID:xBrfKG0X
インターフェースで依存ヘッダ最小化できるの?
2019/02/02(土) 00:19:23.04ID:hwq9uAM7
>>452
なんでお前が勝ち誇ってんだよw
2019/02/02(土) 00:22:54.25ID:hwq9uAM7
上にもあるけどコンストラクタ使えないのは大きな制約だろ
456デフォルトの名無しさん
垢版 |
2019/02/02(土) 15:28:45.27ID:YXCix+RL
わざと変な名前の名前空間使ってるわ。
なんやらかんやら_WorkingNamespace とか。
2019/02/02(土) 16:20:02.86ID:db88iM+8
変な名前にしなくてdetailかimplでいいぞ
2019/02/02(土) 18:17:31.28ID:waqQgiJK
>>455
factoryはだめなの?
2019/02/02(土) 18:28:03.14ID:hwq9uAM7
templateでコンストラクタ呼び出すとこ全滅するじゃん
2019/02/02(土) 18:38:05.82ID:KkdP20n5
隠蔽つったってなぁ、
呼んでも良いのとそうでないのを言語の規則で可視化しようってだけのことで、
なんなら名前規約で「これは外から呼ぶなよ!」というのを徹底できるならば
別にそれでもかまわんのよ。

でも、広く使われるライブラリはキッチリ分けて、
変な使い方をエラーにしてくれた方がありがたいし、
どのくらいキッチリと隠蔽するかは場合によるというか、程度問題よね。
2019/02/02(土) 22:25:17.69ID:wSrrYQ7Y
>>459
コンストラクタが必要になったらそこでラッパーを書けばいい
2019/02/02(土) 22:41:55.99ID:mZCa7M9L
>>459
Factory使えよ
そのテンプレートが現実にどれだけ汎用的に使えたか思い返してみるとわかると思うが、コストラクタを直接呼ぶのは制約が強くなりすぎる
インターフェイスに限った話ではなく一般論として、インスタンスの生成は間に一段Factoryを噛ませたほうがいい
2019/02/02(土) 23:06:34.47ID:7LHz6bLK
左様コンストラクタでFooのファクトリーを呼ぶFooのWrapperクラスでも書いたら一応STL対応はできる気がする
やらないけど
2019/02/02(土) 23:20:07.82ID:BCOo8pbG
Factory が駄目なら Virtualコンストラクタを使えば良いじゃない。by マリー
2019/02/03(日) 05:14:26.28ID:t4xt++Qj
テスト
2019/02/03(日) 09:30:58.19ID:cLU3XamP
・バカ
std::shared_ptr<Pimpl> p = std::make_shared<Pimpl>(a, b);

・賢者
std::shared_ptr<Interface> p = factory->create_shared(a, b);
2019/02/03(日) 09:42:10.45ID:DWuTVIRg
pimplクラスをポインタで取り回すのは確かにバカだ
2019/02/03(日) 10:02:23.87ID:z6lglBs4
ポイントがInterfaceにあるのかcreate_sharedにあるのかよくわからんな。
結局どういう主張?
2019/02/03(日) 10:03:56.22ID:LVMUXp5G
>>466
factoryがshared_ptrを返すのは愚者だろ
生ポかunique_ptrにした方が必要に応じてshared_ptrへも変換できて自由度が高い
2019/02/03(日) 10:12:34.61ID:cLU3XamP
>>469
auto s = factory->create_shared(a, b);
auto u = factory->create_unique(a, b);
auto p = factory->create_raw(a, b);

p->get_deleter()->delete(p);
2019/02/03(日) 10:17:43.87ID:cLU3XamP
pimplで共有、占有、手動のライフサイクルをサポートするにはどうすればいいの?
2019/02/03(日) 12:13:54.64ID:dVyjbDnx
namespaceの名前ってやはり2文字や3文字の短い略称などにするべきだと思いますか?
2019/02/03(日) 12:40:43.63ID:LVMUXp5G
>>472
いいえ
stdは極めて悪い例であり、決して真似してはいけません
2019/02/03(日) 13:35:19.43ID:yzIWridw
>>472
必要に応じてエイリアスを使えばいいので、多少長くとも意味が伝わる名前を意識した方が良いかと思う
2019/02/03(日) 14:31:23.64ID:PHKA1IHb
boost.asioを見れば分かるように長かったり深くても問題ない
476デフォルトの名無しさん
垢版 |
2019/02/03(日) 14:34:36.48ID:14RUg1W9
え?boost参考にしちゃうの?
2019/02/03(日) 17:28:14.38ID:goybUCc4
とりあえずのサンプル的な場面でhageというキーワードつかうのはやめてほしい
478デフォルトの名無しさん
垢版 |
2019/02/03(日) 17:51:32.24ID:DVXBklBr
h_age
2019/02/03(日) 18:48:10.20ID:/SCtje8J
stdは長すぎるとusing namespace stdされるからあれで良い
2019/02/03(日) 19:10:43.15ID:UX3PZoE1
メソッド呼び出し時の値のコピーって排他の考慮は不要なの?
2019/02/03(日) 19:13:40.17ID:cLU3XamP
>>480
当然必要
2019/02/03(日) 20:01:48.90ID:OYz8YI9S
>>479
正気か?
stdの意味をググってこい
2019/02/03(日) 20:14:23.95ID:s/ZudwPt
意味なんでどうでもいいし
よく使うものは短くあるべし
484デフォルトの名無しさん
垢版 |
2019/02/03(日) 20:39:58.91ID:OlGWTuPH
>>483 この人アカン人。
2019/02/03(日) 20:43:45.32ID:yzIWridw
そしてすべてがグローバル名前空間に・・・
486デフォルトの名無しさん
垢版 |
2019/02/03(日) 20:51:16.38ID:14RUg1W9
Excel方式でA1、A2ってつけていけばよい。
2019/02/03(日) 20:58:26.26ID:/SCtje8J
std::XXX程度ならusingなどいちいちせずに毎回std::XXXと書くわの意味
2019/02/03(日) 20:59:27.30ID:JIYTTgNa
今はusingでエイリアス使うことだってできるんだし、定義側はある程度長い名前つけておいたほうがいいだろ。
489デフォルトの名無しさん
垢版 |
2019/02/03(日) 21:48:13.84ID:7BX8k8w8
namespace longlongnamespace{
struct hogehogename{
};
}

namespace untarakantara{
//長すぎる
void test(const longlongnamespace::hogehogename* lhs);
}

上のようにuntarakantaraという名前空間でライブラリを作成するときに長い名前空間だとうざったい。


//この場合usingで取り込むのが正解?
//ライブラリなんだから名前空間まで含めてすべて明記すべき?
namespace untarakantara{
using longlongnamespace::hogehogename;//1
void test(const hogehogename* lhs); //1

void test(const longlongnamespace::hogehogename* lhs);//2
}

//std::filesystemやstd::chrono等を想定
2019/02/03(日) 21:50:58.54ID:mcfLKNvL
ヘッダには長いのをそのまま書いて実装でusing namespaceすればいいじゃん
491デフォルトの名無しさん
垢版 |
2019/02/03(日) 21:59:39.14ID:14RUg1W9
>>490
ユーザーに無駄な手間をかけさせるな。
2019/02/03(日) 22:00:19.11ID:Dsz5FlLI
>>482
性感染症(STD)は、必ずしも自覚症状があるとは限らない病気です
2019/02/03(日) 22:49:53.04ID:t4xt++Qj
>>482
STD:
爆薬に直接に圧力が加わった場合に誘爆すること
2019/02/03(日) 23:52:42.87ID:JIYTTgNa
>>491
必要な手間だろ。
名前バッティングさせる方がよっぽど無駄な手間だわ。
2019/02/04(月) 00:38:59.33ID:crpI56wI
ヘッダファイル(.h)では全体を
namespace longlonglongname { ... }
で囲い、ソースコード本体(.cpp)では冒頭で
using namespace longlonglongname;
としておけば幸せになれるかもしれん…
(開発側はlonglonglongnameを2箇所だけ書けば済むし、3行コメントアウトしたらいつでもlonglonglongnameネームスペースを外せる

べつにソースコード本体の側もnamespace longlonglongname { ... }で囲っても良いが
2019/02/04(月) 00:56:22.60ID:RjHPX//j
>>494
>>479
2019/02/04(月) 08:09:08.83ID:8DX2Gc+T
今ならエイリアスでいいだろ。
usingでnamespace全体持ち込むのはdeprecatedにしてもらってもいいくらいだわ。
2019/02/05(火) 03:18:17.76ID:HIaY+PNB
以下のテンプレート関数が
template <typename T, typename U, int E>
static constexpr T f<E>(const T x, const U y) noexcept
{
return Class<T, U>::f2<E>(x, y);
}

以下のようによびだせないのは何故ですか?
f<3>(x2, y2);
2019/02/05(火) 03:46:47.46ID:VmiK9YL/
>>498
???
どうして出来ると思ったのかわからない。
2019/02/05(火) 03:50:25.51ID:HIaY+PNB
>>499
すみません。一部まちがえました
×static constexpr T f<E>(const T x, const U y) noexcept
○static constexpr T (const T x, const U y) noexcept

これでTとUが引数から引数から推論されて、Eは余っているから明示指定で大丈夫だろうと。
そう思いました。(間違っているようですが。
2019/02/05(火) 03:51:46.67ID:VmiK9YL/
>>498
そのコードを書いてある通りに解釈しようとすると、
f という関数テンプレートの部分特殊化なんだけど、
非メンバ関数の部分特殊化は出来ないし、
f<3>(x2, y2); という使用形式に合致しない。
2019/02/05(火) 03:53:36.88ID:VmiK9YL/
>>500
出来る要件に合致しないとしか言いようが無いので、
そこらへんはきちんとルールを見てもらうしかしょうがない。
2019/02/05(火) 04:02:28.79ID:HIaY+PNB
>>502
書き換えることはできませんか?
Class f2 をいちいち書くのは面倒ξんです。。
2019/02/05(火) 04:09:09.24ID:VmiK9YL/
>>503
テンプレート引数の順序を変えるだけでいけるよ
2019/02/05(火) 13:12:17.63ID:DfuuHrrH
多重ループを抜けるのに例外投げるのってあり?
2019/02/05(火) 13:16:04.40ID:VmiK9YL/
>>505
goto の方がマシ
2019/02/05(火) 13:18:19.94ID:4twphg+x
気兼ねなくgoto使えるチャンスだぞ
2019/02/05(火) 14:17:13.53ID:X+ZOJjRh
goto で多重ループ抜けたとして、ラベルの下には文がなきゃいけないわけだが、何もしたくないときはどんな文を置くの?
2019/02/05(火) 14:20:01.31ID:FmL0gboT
そんなもん 0; でいいじゃん
2019/02/05(火) 14:30:41.39ID:4twphg+x
セミコロンだけでおk
2019/02/05(火) 14:59:34.72ID:VmiK9YL/
>>508
することがなんもないならそのまま return すればいいんじゃね?
2019/02/05(火) 15:12:13.92ID:VmiK9YL/
ところで、多重ループの内側から直接 return するよりは
goto で抜けてから return する方が綺麗かなって私は思うんだけど、
皆の美意識的にはどう思う?
2019/02/05(火) 15:21:55.39ID:3J1ruy+d
抜けた後何もしないのなら、その場でreturnの方が分りやすい
514デフォルトの名無しさん
垢版 |
2019/02/05(火) 15:32:50.28ID:dQJUt0gZ
>>504
横からだけどなるほどありがとう
2019/02/05(火) 16:45:37.41ID:nhJ4ZZtC
>>511,513
すみません、「何もしない」ではなく、「数層上のループに戻る」というのが言いたかったことです

5重ループがあったとして、その中で、ある条件を満たしたら以降の処理はスキップして2重目のループを続ける、ということです


>>509-510
セミコロンだけで良いのですね
ありがとうございます
2019/02/05(火) 17:32:41.77ID:paZD+duB
NEST3:
}
NEST2:
}
NEST1:
}
2019/02/05(火) 17:34:39.81ID:FmL0gboT
個人的にはそのケースは各ループにbreak条件決めて戻るべきだと思ってるけどね
2019/02/05(火) 17:51:19.55ID:ttk98JAj
>>515
内側の二重?ループを関数にして素敵な名前を付けてください
そしてループ中に条件を満たしたらreturnすればいいでしょう
2019/02/05(火) 18:50:04.11ID:nhJ4ZZtC
>>518
ハ?笑
なんでそうしなきゃ駄目なの?

「returnで抜けたい」に引っ張られちゃってんじゃんダサ!笑
2019/02/05(火) 18:57:45.76ID:ttk98JAj
>>519
責務を関数に切り出すのさ
脱初心者したいならあなたも関数の使い方を覚えるべき
2019/02/05(火) 19:59:18.98ID:IbtcjqwQ
結局、関数をまともに書けというプログラムの真髄に到達する。
2019/02/05(火) 20:18:48.97ID:jcSIAavk
つCOBOL
2019/02/05(火) 20:27:12.09ID:S2UV61Jd
関数を書くのがプログラムの真髄w

基本中の基本だろうがw
真髄w
2019/02/05(火) 20:32:17.06ID:4ASLK4cx
>>512
私は、スタックが穢れない方法ならば、直接 return もあり、という美意識です
例外は断固 sjlj で実装すべきだと思っています
2019/02/05(火) 20:58:34.40ID:qTZt50kC
処理を関数に切り出すとそれまでローカルだったものがグローバルな世界に曝け出されるのが
ちょっと気持ち悪いと思うことがある。
pascalみたいなローカル関数が定義できるといいんだけどね。
526デフォルトの名無しさん
垢版 |
2019/02/05(火) 21:01:56.73ID:g0g9sCQz
>>525
ローカルクラスをファンクタにするのは?
2019/02/05(火) 21:12:38.61ID:FmL0gboT
ぶっちゃけ再利用しないものは関数化しない
2019/02/05(火) 21:23:59.05ID:4twphg+x
プログラム自体が関数だしな
529デフォルトの名無しさん
垢版 |
2019/02/05(火) 21:39:46.18ID:YX6xJwJ1
精々2重ループまでしか書かない。
3重超えるときは、前処理で跳ねるわ。
530デフォルトの名無しさん
垢版 |
2019/02/05(火) 21:50:04.80ID:YX6xJwJ1
>>525
Pimpl, 関数のスコープ内にクラス定義できるし、ラムダ式もある。
2019/02/05(火) 22:03:16.15ID:B24ls1Z9
クラスって全部ファンクタでいいよね
2019/02/05(火) 22:17:00.68ID:ttk98JAj
>>525
どうしてグローバルになると思った?
まずその認識から直したほうがよさそうだ
2019/02/05(火) 22:41:27.49ID:XWcjjk28
そりゃ素朴にやればヘッダに書くことになるからだろ
つっこむところか?
2019/02/05(火) 22:58:22.32ID:IbtcjqwQ
>>523
基本が真髄です。
まあ本当に当たり前のことが当たり前にできないプログラマなんて腐る程いるよ。
2019/02/05(火) 23:20:37.88ID:ttk98JAj
>>533
ヘッダに書くとグローバルの繋がりは無いぞ
可視性について調べてごらん
536デフォルトの名無しさん
垢版 |
2019/02/05(火) 23:30:36.12ID:g0g9sCQz
やだなあ冗談やんけ。
そんなお尻真っ赤にして怒るなよ。
2019/02/05(火) 23:55:24.87ID:J4pnNQ65
>>516
ラベルの次には文が要る(「;」で良いが

>>533
多分クラスXのメソッドX::Foo()をX::Foo()と関数bar()に分けるとしたら、
bar()がXとは直接関係を持たない関数になってXのメンバに簡単にはアクセスできなくなるか、
あるいはbar()をXのメソッドにせねばならいという面倒が生じる
と感じる…
2019/02/06(水) 00:00:34.27ID:xEjOz3Cc
bar()が独立した関数とするにふさわしい他との依存性が小さい処理内容なら別に分けても良いが、
フローの見かけを簡単にしたいという目的で>>520式の切り出しを乱発したらたちまち債務超過に…
2019/02/06(水) 00:07:33.57ID:8+AMOzIa
>>538
フローの見かけを変えたいなどというつまらない目的では無い
責務の切り出しだと最初から言っとるだろーが
責務を適切に見極められないから5重ループなんていう悪魔的なコードを平気で書いちゃうんだよ
2019/02/06(水) 00:14:56.50ID:8+AMOzIa
>>537
メソッドでいいんだよ
めんどくさくねえよ
5重ループのほうが扱いメンドクセーって
2019/02/06(水) 00:18:52.55ID:xEjOz3Cc
5組の集合の総当りとかなら5重ループで書くのがいちばん自然で速い
n組の集合の総当りとか可変になってくるなら数え上げのアルゴリズムを変える
どっちにせよ関数を増やすことは必須ではない
2019/02/06(水) 00:27:22.81ID:8+AMOzIa
内側のループで明らかに何らかの判断を行ってその結果を外側のループが利用してる
ここで行ってる何らかの判断が責務に該当するわけだ
ならばそれをメソッドの切り出して何をしてるのか明らかな名前を付けてやればいい
プログラムってのはこうやって書くんだぜ
もしこれをメソッドにしなければ何らかの判断をすることとその結果を見て何かすることという複数の責務がメソッドに割り当てられたダーティなプログラムになってしまう
2019/02/06(水) 00:33:36.55ID:xEjOz3Cc
>内側のループで明らかに何らかの判断を行ってその結果を外側のループが利用してる
外側の債務を肩代わりする内側への資金供与はどうするんじゃ…
事実上の5重ループのもっとも内側(もっとも数多く繰り返し実行される)で、事実上引数が5個あるも同然の関数をもっとも数多く繰り返し実行するのか…

ループ構造をのまま関数の構造に変換するのはあんま筋のいいアイデアではないと思うワケ
第一なんか変更があったとき直しにくい
2019/02/06(水) 00:36:02.10ID:AKR+nTaH
そりゃコードレベルで考えてるからだろう
意味を考えずにコードだけをこねくり回すから後で変更が入るんだよ
意味のある単位で関数化しろ
2019/02/06(水) 00:37:56.91ID:xEjOz3Cc
意味を考えれ、という為らば過度の多重ループは数え上げのアルゴリズムを変えた(>>543)方が…
2019/02/06(水) 00:39:50.29ID:8+AMOzIa
>>543
いつになったらループ構造を関数化しただけって勘違いを止めれるんだ?
責務で分割ってなんどいえばわかるんだろな君は
2019/02/06(水) 01:10:17.64ID:TluxhF2l
深いネスト書くやつと長い関数・クラス書くやつはダメプログラマ
2019/02/06(水) 01:14:36.80ID:LZQuj/e3
わしらじじいの時代は関数ごとに1ファイルの.cに分けて書け、と言われたもんじゃった・・・
・・今考えたらアホやな
2019/02/06(水) 01:14:44.26ID:ynCNotXu
関数型言語だとループ使わねえもんな
2019/02/06(水) 01:19:14.37ID:TVvP4aoc
全部ファンクタにしてループを抹消しよー
2019/02/06(水) 01:54:02.43ID:1PkYZi2l
C++の殆どのコンパイラはループ自体の最適化はそこそこイケるけど再帰のループへの最適化は多用できるほど強くはない印象ある
functorがマイブームっぽい人が見受けられるけどC++2aに期待かねぇ
552デフォルトの名無しさん
垢版 |
2019/02/06(水) 02:10:57.61ID:tVubCuJx
抽象化してアルゴ切り替えとか便利だし>ファンクタ。
ループ抹消は新興宗教だわ。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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