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
408デフォルトの名無しさん
垢版 |
2019/01/30(水) 23:40:14.23ID:Etz6JgfQ
>>407
ならスマブ発明しろよ。
2019/01/30(水) 23:58:05.04ID:GTSr1lmt
boolのインクリメントはもう駄目にならんかったっけ
410デフォルトの名無しさん
垢版 |
2019/01/31(木) 01:03:44.53ID:1/qzJ5j1
ブールの++は禁止されるね。

スマートブール つ
struct Bool {
enum class Value { True, False };
Value value;
// その他I/Fはお好みで、でも++とか上書きしないように。
};
2019/01/31(木) 11:58:25.10ID:xxTKFGAk
>>410
Trueがゼロとかキチガイかよ
結局Valueがそのまんま外に出てて、単なる enum class と比較して全く何の意味もないし
2019/01/31(木) 12:04:22.91ID:AG1iGZmY
やるなとお達しがきたことをやろうとするなよ
413デフォルトの名無しさん
垢版 |
2019/01/31(木) 12:41:33.66ID:1/qzJ5j1
struct を class に置き換えるなり好きに使えよアホ。挙動に制限つけたブール定義するのは簡単って意味。多少面倒でも人殺すよりまし。

キャストとかimplicitコンストラクタとか型安全な範囲で定義してね。
思考力無いんか? 猿なの? お前みたいなの職場にいたらガン無視。ナスと出世目の前にぶら下げて使い倒して、年食ったら捨てるわ。
2019/01/31(木) 13:10:00.69ID:xxTKFGAk
>>413
知らんがな
413の頭の中には完璧にタイプセーフなぼくのかんがえたさいきょうのboolがあるのかもしれないが、
>>410のコードから単なる馬鹿と優秀な413の違いを読み取るのはさすがに無理がある
俺達に見えてるのはお前のレスの文面だけなんだから、馬鹿だと思われたくないなら馬鹿に見えないようなレスを書きなさい
415デフォルトの名無しさん
垢版 |
2019/01/31(木) 13:31:27.74ID:1/qzJ5j1
バカに物事を説明すんの大変なの忘れてたわ。
2019/01/31(木) 13:43:59.16ID:sy1gbegF
大入するときいちいちBool::Value::Trueとかってやるの?
417デフォルトの名無しさん
垢版 |
2019/01/31(木) 13:57:43.91ID:1/qzJ5j1
ラフスケッチって言葉知ってる?
2019/01/31(木) 16:17:54.16ID:VRtcylyh
ラフスケッチだったのか
下手すぎて知恵遅れの落書きと区別付かんかったわ
2019/01/31(木) 16:53:45.33ID:Z74WfsQD
このスレって、昔デパートの屋上とかでやってた
マングースvsコブラみたいなおもしろさがあるな
2019/01/31(木) 17:57:23.79ID:yYR5uNJo
こういうつまらんネタに食いついたら負け
2019/01/31(木) 18:40:23.44ID:EoQh+WIC
キャットファイトでしょうに
422デフォルトの名無しさん
垢版 |
2019/01/31(木) 19:14:06.04ID:1/qzJ5j1
落書きレベルのトリックで回避できる問題が10年以上放置されてるのがC++。
2019/01/31(木) 19:31:16.26ID:kVV1KZIE
>>410だと何がスマートになるの?
trueとfalseは逆にするとして。
424デフォルトの名無しさん
垢版 |
2019/01/31(木) 19:48:03.87ID:1/qzJ5j1
暗黙型変換と人が「普通に」書いてしまう演算からbool値の持つ論理的な意味を守れる。
2019/01/31(木) 19:53:56.29ID:/EjhL9q2
bool は整数型のカテゴリに入ってるから
整数型同士の演算の中ではうっかり int に昇格されたりするんよ。
2019/01/31(木) 20:36:17.65ID:/iSEbovL
だったらexplicit operator boolも書いとけばいいのに
誰でも落書きできる所までしか書かないから知恵遅れに見える
2019/01/31(木) 20:48:55.70ID:MHcg0e3g
boolの問題なんてさんざん語りつくされてる話題なわけで
そんなにいきり立つのも知恵遅れに見えるんだが
2019/01/31(木) 20:52:11.62ID:AG1iGZmY
そもそもこのスレに新規性なんかないじゃん
2019/02/01(金) 18:33:11.64ID:yTOsL8ZZ
pimplって具体的に何が凄いのが実感出来ない‥
実感できるコード例ってありませんか?
2019/02/01(金) 19:20:32.36ID:F7i5oL97
コード例は示せないけど
dllとかlib作るときに使ってみるといいと思う
2019/02/01(金) 19:48:57.61ID:poPQewMk
つまんないもん見せなくて済むじゃないか
2019/02/01(金) 20:06:34.47ID:fyiIuKBL
実装を隠したいときに必須なんだが
隠す必要を感じてない人に説明するのは難しいんだよな
必要ない人は一生必要ないからね
2019/02/01(金) 20:26:30.63ID:cIYuVXTd
必須ではないがな
他にも方法はある
434デフォルトの名無しさん
垢版 |
2019/02/01(金) 20:35:32.21ID:cfE6zEWc
>>429
Qt使ってみればわかるよ。
コンパイル早め、デバッグ難しすぎ。
そんな感じ。
2019/02/01(金) 20:44:11.59ID:h+AyUO7a
インターフェース準備してスマポ返せばええやんけpimplなんぞいらんしって思いました
436デフォルトの名無しさん
垢版 |
2019/02/01(金) 20:46:34.12ID:cfE6zEWc
>>435
設計の本には、実装を隠ぺいすることで変更に強くなると書いてあるけど、Qt見ると、いい部分も悪い部分もあるね。
437デフォルトの名無しさん
垢版 |
2019/02/01(金) 20:47:43.65ID:cfE6zEWc
各種OSに対応するには、pimplが良かったのかもしれない。
2019/02/01(金) 20:50:18.54ID:h+AyUO7a
実装を隠したいならインターフェース使うだけでいい
インターフェースと比べた時にピンプルにはこれといってメリットはない
439デフォルトの名無しさん
垢版 |
2019/02/01(金) 20:55:50.49ID:cfE6zEWc
>>438
設計本の著者は大御所ぞろいだし、身分を明かさず主張しても無駄なのでは。
明かしたらもっと無駄って場合もあるけど。
2019/02/01(金) 20:56:30.95ID:V+NZiA0Z
コンパイル時間が短くなるのがpimplの利点で実装を隠蔽出来るのは副次的なものと何処かで見た気がする
2019/02/01(金) 21:02:05.52ID:F7i5oL97
pimplの利点は依存ヘッダを減らせることだと思ってる
真のprivateとかに感動してる人いるけど、あれはなんか違う・・・
442デフォルトの名無しさん
垢版 |
2019/02/01(金) 21:07:03.72ID:sG4RlIjp
開発の効率化=pimpleの利点。
小さな変更で全ビルド5分待ちはやってられん。
一々ヘッダにこんなもん書くかよ、って思ったり思わせたりしないで済む。
2019/02/01(金) 21:49:44.81ID:cIYuVXTd
>>438
呼び出しコスト
factory経由

あたりがネックになる場合もある
2019/02/01(金) 21:51:57.86ID:cIYuVXTd
組み込みやってる身としてはpimplは中でnewかまされるのが困る
インターフェースも同様
2019/02/01(金) 22:26:16.19ID:F7i5oL97
同じことを思ってplacement newでやる奴を昔作ったけど、std::launderがないと辛かった
2019/02/01(金) 22:26:54.36ID:q6HbkB1M
別にnewしなても代わりにobj[1000]から&obj[0]、&obj[1]、&obj[2]、…を返すファクトリーにしたら良いんじゃ…
2019/02/01(金) 22:38:43.24ID:x/1+NmNy
無名namespaceもいいもんだよ
2019/02/01(金) 22:54:58.73ID:2kCPE8R8
コンパイルエラーで見づらくなるから使わねーわ
2019/02/01(金) 23:17:25.49ID:q6HbkB1M
クラスの定義をファイルスコープ(風)にしたいときは無名namespaceを使うしかない
static class Foo { ... };と書けたら良いのに!
2019/02/01(金) 23:45:38.78ID:j6iAMD6D
private namespaceはよ
2019/02/01(金) 23:56:09.24ID:F7i5oL97
nemaspace templateが欲しいとたまに思う
2019/02/01(金) 23:58:16.64ID:h+AyUO7a
ここまでピンプルのメリットすべてインターフェースでも得られる件
・実装隠蔽
・コンパイル時間短縮
・依存ヘッダ最小化
やはり無駄なイディオムだったか
無意味にテクニカルに見せかけてカッコつけたかっただけだろ
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使えるチャンスだぞ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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