次スレを立てる時は本文の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++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/
このスレもよろしくね。
【初心者歓迎】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
C++相談室 part141
■ このスレッドは過去ログ倉庫に格納されています
2019/02/22(金) 03:07:43.52ID:MgOIx7iK
377デフォルトの名無しさん
2019/03/16(土) 00:18:04.69ID:HR8X4dmV378デフォルトの名無しさん
2019/03/16(土) 00:23:45.45ID:oXtW8C30 そうなんだよね
例外の仕組みわかってないやつは平気で動的ライブラリの界面に
例外使ったりするんだよね
あと標準ライブラリ丸出しにするやつもしかり
それ誰も互換性保証してねーから
例外の仕組みわかってないやつは平気で動的ライブラリの界面に
例外使ったりするんだよね
あと標準ライブラリ丸出しにするやつもしかり
それ誰も互換性保証してねーから
379デフォルトの名無しさん
2019/03/16(土) 00:24:47.11ID:UXq90ll9 >>376
核戦争を生き抜くには。
核戦争を生き抜くには。
380デフォルトの名無しさん
2019/03/16(土) 00:24:57.90ID:HR8X4dmV まあ標準ライブラリの例外の使い方のおかしさも気になるが
std::stoiで例外投げるバージョンしか無い上に何故かlogic_error扱いのinvalid_argumentやout_of_range投げる
いや、これ出る状況普通runtime_errorだよね
std::stoiで例外投げるバージョンしか無い上に何故かlogic_error扱いのinvalid_argumentやout_of_range投げる
いや、これ出る状況普通runtime_errorだよね
381デフォルトの名無しさん
2019/03/16(土) 00:29:24.58ID:cz3ooqCT >例外含めて外部仕様としてかっちり決まっているべきものじゃね
そこを言語の機構で保証できない、動的言語みたいななあなあ状態なのが残念なところだね。
それをきっちり保証しようとした検査例外はそれはそれで扱いづらいところがあるし。
そこを言語の機構で保証できない、動的言語みたいななあなあ状態なのが残念なところだね。
それをきっちり保証しようとした検査例外はそれはそれで扱いづらいところがあるし。
382デフォルトの名無しさん
2019/03/16(土) 00:29:25.98ID:U4afEAjj383デフォルトの名無しさん
2019/03/16(土) 00:36:35.46ID:UXq90ll9 そこでプロパティ型なんですよ。
384デフォルトの名無しさん
2019/03/16(土) 06:11:19.71ID:7Yfqh0Zg385デフォルトの名無しさん
2019/03/16(土) 06:46:32.47ID:TLiwIm0H 復旧不可能な例外もあれば、些細な例外もあるよね。
戻り値チェックで十分でしょと思うようなところで例外を投げるJava/C#みたいな流儀だと、いちいちキャッチするのが面倒。
戻り値チェックで十分でしょと思うようなところで例外を投げるJava/C#みたいな流儀だと、いちいちキャッチするのが面倒。
386デフォルトの名無しさん
2019/03/16(土) 06:52:39.99ID:TLiwIm0H Cでは戻り値で判定できたはずのエラー種別が例外クラスで細かく分類されてしまったことで、
エラー処理で書かなければならないコード量が増えて例外のキャッチ漏れまで起きる危険性が生み出された。
エラー処理で書かなければならないコード量が増えて例外のキャッチ漏れまで起きる危険性が生み出された。
387デフォルトの名無しさん
2019/03/16(土) 07:31:06.00ID:5/K53Ire その程度の知識で語ってる奴は戻り値方式でも処理漏れするだろw
388デフォルトの名無しさん
2019/03/16(土) 07:35:15.72ID:/kg6KhNe 例外の嫌なところは
処理できない案件を低水準側に丸投げするところなんだよな…
ユニックスのプロセスの死亡順序もそうだが、
計算機業界は常識が逆転してゐる…
処理できない案件を低水準側に丸投げするところなんだよな…
ユニックスのプロセスの死亡順序もそうだが、
計算機業界は常識が逆転してゐる…
389デフォルトの名無しさん
2019/03/16(土) 07:38:02.24ID:/kg6KhNe というわけでおそらくアプリの設計シチュの99%ぐらいは
例外発生=プログラムの死亡
、とみなして良いはず
ここまで割り切るならはじめて例外はお手軽で便利と言える
例外発生=プログラムの死亡
、とみなして良いはず
ここまで割り切るならはじめて例外はお手軽で便利と言える
390デフォルトの名無しさん
2019/03/16(土) 12:28:02.50ID:UXq90ll9 例外をキャッチしたらプランBに移行するのが、真の戦闘のプロ。
391デフォルトの名無しさん
2019/03/16(土) 12:49:25.73ID:V15J7n/y 例外なんてグローバル変数みたいなもの。
だから低レイヤで使うのは仕方ない
だから低レイヤで使うのは仕方ない
392デフォルトの名無しさん
2019/03/16(土) 12:50:47.84ID:jRc2/nMs std::cin >> a;
は入力を延々と待っている。
これ別スレッドから止めさせる方法はありますか?
は入力を延々と待っている。
これ別スレッドから止めさせる方法はありますか?
393デフォルトの名無しさん
2019/03/16(土) 13:10:50.41ID:V15J7n/y stdin閉じるとどうなる?
394デフォルトの名無しさん
2019/03/16(土) 15:40:22.15ID:/kg6KhNe (組み込みはともかくアプリの場合は呼び出し元の方が高水準レイヤにあたるのではないかというツッコミが来ると思ったが
来なかったので黙っていよう…
来なかったので黙っていよう…
395デフォルトの名無しさん
2019/03/16(土) 17:27:11.59ID:/kg6KhNe396デフォルトの名無しさん
2019/03/16(土) 19:15:22.19ID:zOgp3uDK397デフォルトの名無しさん
2019/03/16(土) 20:00:47.57ID:TLiwIm0H 多くの例外の基底クラスになる exception にエラーコード整数値を出力する関数があればもう少しC寄りのエラー処理ができたと思うのだが。
既存のexceptionメンバ関数 const char *what() だけでは扱いが困難。
既存のexceptionメンバ関数 const char *what() だけでは扱いが困難。
398デフォルトの名無しさん
2019/03/16(土) 20:14:28.85ID:1JRLHvWf std:::to_string();
399デフォルトの名無しさん
2019/03/16(土) 20:14:39.74ID:w9XKSp7E >>397
必要ならそういうクラスを定義するだけだろ
必要ならそういうクラスを定義するだけだろ
400デフォルトの名無しさん
2019/03/16(土) 20:15:00.26ID:1JRLHvWf sage
401デフォルトの名無しさん
2019/03/16(土) 20:39:18.42ID:cz3ooqCT ユーザーにエラー原因を示すだけならconst char*でも大して問題ないし、
catchした側でエラーコードによって何かするというのはたいていアンチパターン。
catchした側でエラーコードによって何かするというのはたいていアンチパターン。
402デフォルトの名無しさん
2019/03/16(土) 22:15:57.75ID:HR8X4dmV 文字をwchar_tで処理しているプログラムだと例外文字列作るのが面倒
まあ詳細な情報出さずに固定文字列にしてしまえばいいんだけど
まあ詳細な情報出さずに固定文字列にしてしまえばいいんだけど
403デフォルトの名無しさん
2019/03/17(日) 00:42:25.28ID:OzxlZzXh templateの使い道がいまいちわからん
STLやboostみたいなものは非常に有益だが
同僚がドヤ顔でコンテナを作ったって自慢してたが、
stlのコンテナを使わずにそいつのコンテナを使う理由が無い
STLやboostみたいなものは非常に有益だが
同僚がドヤ顔でコンテナを作ったって自慢してたが、
stlのコンテナを使わずにそいつのコンテナを使う理由が無い
404はちみつ餃子 ◆8X2XSCHEME
2019/03/17(日) 00:46:12.21ID:aA4z/LNt405デフォルトの名無しさん
2019/03/17(日) 00:48:31.10ID:UT79+Nc/ 同じコードをコピペしなくて済むから、作業量も減るし、保守も楽になる。
406デフォルトの名無しさん
2019/03/17(日) 00:56:16.88ID:NYZE0cFr407はちみつ餃子 ◆8X2XSCHEME
2019/03/17(日) 00:58:29.44ID:aA4z/LNt 重複があることを事前に発見するのは難しい場合もあるから、
同じことを何度も書いている気がするなと思ったら
どうにかしてまとめることを検討するという程度でもいいかもね。
同じことをしないようにする、いわゆる DRY 原則というものはあるけど、
一方で、それを意識するあまりしなくてよい抽象化層を設けるのも馬鹿らしいということで、
必要になってからやるという YAGNI という考え方もある。
こういうのは程度問題なので、なんでもほどほどにね。
同じことを何度も書いている気がするなと思ったら
どうにかしてまとめることを検討するという程度でもいいかもね。
同じことをしないようにする、いわゆる DRY 原則というものはあるけど、
一方で、それを意識するあまりしなくてよい抽象化層を設けるのも馬鹿らしいということで、
必要になってからやるという YAGNI という考え方もある。
こういうのは程度問題なので、なんでもほどほどにね。
408デフォルトの名無しさん
2019/03/17(日) 01:15:02.15ID:7ciqStwp テンプレート(のパラメータにおける型の自動推論)と
関数のオーバーロードの合わせ技によるコードのまとめ力は異常
関数のオーバーロードの合わせ技によるコードのまとめ力は異常
409デフォルトの名無しさん
2019/03/17(日) 01:37:37.76ID:7ciqStwp 例えばストレージからintを読み込む関数、doubleを読み込む関数、unsigned charを読み込む関数を
同じ関数名と同じ引数の並び(例えばbool read(FILE* fp, <目的とする型>& x とか)ででオーバーロードしておけば、
template<class T1, class T2, class T3>
bool read_x3(FILE* fp, T1& x1, T2& x2, T3& x3) {
if (!read(fp, x1)) { return false; }
if (!read(fp, x2)) { return false; }
if (!read(fp, x3)) { return false; }
return true;
}
でもって、オーバーロードを実装した任意の型3個の組み合わせについて読込関数が実体化される
(実装されていない型に行き当たったらエラーになるからワカル
これはn個の関数と1個のテンプレートを書いただけで、n^3パターンもののユースケースに網羅的に対応できたことになるからスゲー強力
※ 個人の感想です
同じ関数名と同じ引数の並び(例えばbool read(FILE* fp, <目的とする型>& x とか)ででオーバーロードしておけば、
template<class T1, class T2, class T3>
bool read_x3(FILE* fp, T1& x1, T2& x2, T3& x3) {
if (!read(fp, x1)) { return false; }
if (!read(fp, x2)) { return false; }
if (!read(fp, x3)) { return false; }
return true;
}
でもって、オーバーロードを実装した任意の型3個の組み合わせについて読込関数が実体化される
(実装されていない型に行き当たったらエラーになるからワカル
これはn個の関数と1個のテンプレートを書いただけで、n^3パターンもののユースケースに網羅的に対応できたことになるからスゲー強力
※ 個人の感想です
410デフォルトの名無しさん
2019/03/17(日) 01:43:06.21ID:Jta37aFk411デフォルトの名無しさん
2019/03/17(日) 01:44:01.66ID:7ciqStwp なおこのテクをつきつめれば、テンプレートの特殊化というのは普通の意味では要らなくなるキモス、
むしろ特定の型の組み合わせについて自動展開を禁止したいときに使う
(例えば可変長データのread関数を、データの先頭にデータの個数を書く約束で作ったとして、
個数を読み込む関数を整数のread(fp, x)に限定したい場合、個数の型をdoubleにした特殊化テンプレートを書いてわざとエラーにするとか、
むしろ特定の型の組み合わせについて自動展開を禁止したいときに使う
(例えば可変長データのread関数を、データの先頭にデータの個数を書く約束で作ったとして、
個数を読み込む関数を整数のread(fp, x)に限定したい場合、個数の型をdoubleにした特殊化テンプレートを書いてわざとエラーにするとか、
412デフォルトの名無しさん
2019/03/17(日) 01:47:31.21ID:7ciqStwp413デフォルトの名無しさん
2019/03/17(日) 01:58:32.33ID:ADoP4x2u テンプレートはヘッダに全部書かなきゃいかんのなんとかならんか?
414デフォルトの名無しさん
2019/03/17(日) 02:06:35.73ID:NYZE0cFr 原理上どうにもならない
415デフォルトの名無しさん
2019/03/17(日) 02:10:16.54ID:7ciqStwp テンプレートの分割コンパイルは一度実装されたが1年がかりの複雑な仕事になったし
あまりに複雑すぎて普及に至っていないというようなことがプログラミング言語C++で読んだ記憶、
しかし、importキーワードがC++の予約語であるうちはまだ希望がある
あまりに複雑すぎて普及に至っていないというようなことがプログラミング言語C++で読んだ記憶、
しかし、importキーワードがC++の予約語であるうちはまだ希望がある
416デフォルトの名無しさん
2019/03/17(日) 02:10:32.44ID:Jta37aFk FILE* fp は 標準のfgetc()の実行速度が遅くて残念。バッファリングしている甲斐がない。
417デフォルトの名無しさん
2019/03/17(日) 02:26:35.34ID:UT79+Nc/ 使いたい型決まっているなら別にできるだろ?
ヘッダで宣言だけ書いて、ソースで定義と明示的インスタンス化すればいいだけ
ヘッダで宣言だけ書いて、ソースで定義と明示的インスタンス化すればいいだけ
418デフォルトの名無しさん
2019/03/17(日) 02:34:45.67ID:61bjcvzF 3大C++無限ループ話題
テンプレート実装の分割記述
getsetの実装
あと一つは?
テンプレート実装の分割記述
getsetの実装
あと一つは?
419デフォルトの名無しさん
2019/03/17(日) 03:18:11.89ID:4v9XGq5+ 多重ループの抜け方
420デフォルトの名無しさん
2019/03/17(日) 03:19:37.14ID:XP0TJBl2 STLにツリーがない理由を教えてください。
421デフォルトの名無しさん
2019/03/17(日) 04:14:30.81ID:OzxlZzXh あるクラスが非トリビアルなコピーコンストラクタをもっていることを検出したい
そのクラスのメンバの型が非トリビアルなコピーコンストラクタを持っていたとしても。
そのクラスのメンバの型が非トリビアルなコピーコンストラクタを持っていたとしても。
422デフォルトの名無しさん
2019/03/17(日) 06:02:45.37ID:NYZE0cFr >>418
メモリが云々
メモリが云々
423デフォルトの名無しさん
2019/03/17(日) 06:48:43.74ID:WBoQCy0z >>413
テンプレートを抜き出してヘッダーファイルを生成するプリプリプロセッサを作ればいい
テンプレートを抜き出してヘッダーファイルを生成するプリプリプロセッサを作ればいい
424デフォルトの名無しさん
2019/03/17(日) 08:23:20.60ID:h3PfG3Ac >>421
トリビアルコピー出来ないことを検出したいならis_trivially_copyableで充分だけどそれ以上のことがしたいの?
トリビアルコピー出来ないことを検出したいならis_trivially_copyableで充分だけどそれ以上のことがしたいの?
425デフォルトの名無しさん
2019/03/17(日) 08:28:29.93ID:qh1L90Cw426デフォルトの名無しさん
2019/03/17(日) 08:33:05.90ID:NYZE0cFr 名人様一名いらっしゃいました
427デフォルトの名無しさん
2019/03/17(日) 11:20:51.42ID:2Lg7N/Z5 >>411
> 個数の型をdoubleにした特殊化テンプレートを書いてわざとエラーにするとか、
そういうときはdelete指定が使えるんじゃね?
というかis_floating_pointとかで弾いた方がいいとも思うけど
> 個数の型をdoubleにした特殊化テンプレートを書いてわざとエラーにするとか、
そういうときはdelete指定が使えるんじゃね?
というかis_floating_pointとかで弾いた方がいいとも思うけど
428デフォルトの名無しさん
2019/03/17(日) 12:03:09.87ID:UT79+Nc/429デフォルトの名無しさん
2019/03/17(日) 13:22:57.65ID:UT79+Nc/ variadicだた
430デフォルトの名無しさん
2019/03/17(日) 13:42:47.24ID:XP0TJBl2 バリスティック・テンプルね。
431デフォルトの名無しさん
2019/03/17(日) 15:09:36.00ID:WBoQCy0z >>425
サンプルにまでマウントするとかw
サンプルにまでマウントするとかw
432デフォルトの名無しさん
2019/03/17(日) 15:29:33.79ID:XP0TJBl2 マウントの定義を教えてください。
433デフォルトの名無しさん
2019/03/17(日) 16:01:22.88ID:Ymi5ijHL 明確な定義があるわけじゃないけど、主に「勘違いした高卒が高等な他人を見下してること、もしくはその様」を指す語としてつかわれてんじゃないの
434デフォルトの名無しさん
2019/03/17(日) 21:10:58.21ID:NYZE0cFr >>432
意識高い系
意識高い系
435KAC
2019/03/17(日) 21:23:45.76ID:nO6ODsyT436デフォルトの名無しさん
2019/03/17(日) 21:42:19.60ID:2Lg7N/Z5 >>436
誰?
誰?
438デフォルトの名無しさん
2019/03/17(日) 22:22:05.53ID:VD3ReUoA オープンソース化されたWindowsの電卓を見たが、クッソ綺麗でモダンなコードだな
439デフォルトの名無しさん
2019/03/17(日) 22:25:37.54ID:NYZE0cFr 多分7に入ってた電卓とは別物だな
440デフォルトの名無しさん
2019/03/17(日) 23:22:31.89ID:0FN5yhQH441デフォルトの名無しさん
2019/03/18(月) 00:13:57.67ID:HNvbYtsL Windowsカーネルのオープンソース化待ってます
442デフォルトの名無しさん
2019/03/18(月) 05:32:24.67ID:+E07qlDR sort関数の比較関数を、クラスのメンバ関数として定義すると invalid use of non-static member function というエラーが出ます。
なぜこれは禁止されるのでしょうか。
また、どうやって解決したら良いですか。
なぜこれは禁止されるのでしょうか。
また、どうやって解決したら良いですか。
443デフォルトの名無しさん
2019/03/18(月) 05:33:36.55ID:HNvbYtsL エラーメッセージ読みなよ
444デフォルトの名無しさん
2019/03/18(月) 06:41:53.05ID:8TZ/BLJn 理屈を知ってる人には当然だけど、初めての人は混乱する部分じゃないかな。
sort で使う比較関数は色んな形で宣言できるけど、宣言する場所によって
エラーにならずに使える関数の形式が違うってやつ。
>>442 メンバ関数にした比較関数のプロトタイプ宣言はどんな感じ?
sort で使う比較関数は色んな形で宣言できるけど、宣言する場所によって
エラーにならずに使える関数の形式が違うってやつ。
>>442 メンバ関数にした比較関数のプロトタイプ宣言はどんな感じ?
445デフォルトの名無しさん
2019/03/18(月) 08:08:37.98ID:HNvbYtsL 非staticメンバをstaticのように使おうとしたときに出るエラーだからsortとか関係ない
Class::funcをsortに入れたんでしょ
Class().funcとするかfuncをstaticにするだけ
Class::funcをsortに入れたんでしょ
Class().funcとするかfuncをstaticにするだけ
446デフォルトの名無しさん
2019/03/18(月) 08:49:38.19ID:fJqFZa8b 今時はClass().funcでいけるんすか
447デフォルトの名無しさん
2019/03/18(月) 09:58:55.92ID:7+YzgLjV Class::funcってstaticじゃないの?
448デフォルトの名無しさん
2019/03/18(月) 10:42:04.28ID:9EOa0iNV ->*みたいな書き方の意義がわかったら一人前どすな
449デフォルトの名無しさん
2019/03/18(月) 11:13:12.39ID:27d4/ixp ちなみにどんな意義があるの?
450デフォルトの名無しさん
2019/03/18(月) 19:22:09.39ID:SgtRGl5R451デフォルトの名無しさん
2019/03/18(月) 20:05:14.79ID:c3AGzLzz 結局その場でラムダ式書くのが一番わかり易いんだよね
453デフォルトの名無しさん
2019/03/18(月) 21:20:34.54ID:lCR32A1k エクセルで使われているようなGUIにちょっとしたアニメーションをつけるには何使えばいい?
455デフォルトの名無しさん
2019/03/18(月) 21:43:42.87ID:lCR32A1k >>454
例えば四角形の座標の終点の値と移動にかかる時間をするだけでヌルッと動いてくれる機能があるやつがいいです
例えば四角形の座標の終点の値と移動にかかる時間をするだけでヌルッと動いてくれる機能があるやつがいいです
456デフォルトの名無しさん
2019/03/18(月) 21:45:05.39ID:ok5NeesM 普通にcのsort関数使えばいいのに。
キャストしたら負けとでも思ってんのかね。
キャストしたら負けとでも思ってんのかね。
457デフォルトの名無しさん
2019/03/18(月) 21:59:25.97ID:MtU5H+Zb >>455
cocos2d
cocos2d
458デフォルトの名無しさん
2019/03/18(月) 22:47:37.12ID:DisgVN8i std::initializer_list<int> l()
{
return std::initializer_list<int>{1,2,3};
}
std::vector<int> v()
{
return std::vector<int>{1,2,3};
}
int main()
{
for(auto i : l()){
std::cout << i << endl;
}
for(auto i : v()){
std::cout << i << endl;
}
}
0
0
0
1
2
3
なんで?
{
return std::initializer_list<int>{1,2,3};
}
std::vector<int> v()
{
return std::vector<int>{1,2,3};
}
int main()
{
for(auto i : l()){
std::cout << i << endl;
}
for(auto i : v()){
std::cout << i << endl;
}
}
0
0
0
1
2
3
なんで?
459デフォルトの名無しさん
2019/03/18(月) 22:56:40.87ID:bBcTS09+460デフォルトの名無しさん
2019/03/18(月) 23:23:21.73ID:qPN/SC1k461デフォルトの名無しさん
2019/03/18(月) 23:28:12.28ID:c3AGzLzz qsort「おっワイの出番か?」
462デフォルトの名無しさん
2019/03/19(火) 00:00:01.33ID:V3eHYYxi cのsortってラムダ渡せないし、ワザワザ面倒くさい記述してまで使う意味無いだろう。
463デフォルトの名無しさん
2019/03/19(火) 00:37:48.08ID:wfF3ncvB template<typename T>
T func(T a){
}
という関数の中身として、T が int なら a*2 を返し、T が double ならa/2 を返し、それ以外なら a を返す、という処理にしたい場合どう書いたら良いのでしょうか。
関数ごと特殊化する方法があるのは勉強したのですが、一行分の処理を特殊化するために関数ごと特殊化するべきなのでしょうか。
簡単化のため、必要さが全くない例になっていますがよろしくお願いします。
T func(T a){
}
という関数の中身として、T が int なら a*2 を返し、T が double ならa/2 を返し、それ以外なら a を返す、という処理にしたい場合どう書いたら良いのでしょうか。
関数ごと特殊化する方法があるのは勉強したのですが、一行分の処理を特殊化するために関数ごと特殊化するべきなのでしょうか。
簡単化のため、必要さが全くない例になっていますがよろしくお願いします。
464デフォルトの名無しさん
2019/03/19(火) 00:43:22.56ID:fW/dBWxG STLが天才なのは分かったけど、遅くなりそうなのも分かってしまった。
465デフォルトの名無しさん
2019/03/19(火) 00:49:23.69ID:fW/dBWxG466デフォルトの名無しさん
2019/03/19(火) 00:54:54.54ID:V3eHYYxi >>463
簡単化しすぎて何を質問したいのかよくわからない
その例の程度の処理なら、intとdoubleの関数をオーバーロードして、template関数でデフォルトの処理も書けばいい
intとdoubleをどうしてもtemplate化したかったら特殊化で書けばいい
前後に長い共通処理がある場合の一部式だけ個別にしたいなら、関数オブジェクトで式を引数にとる補助template関数作って、上記手法で型毎にlambdaで式を変えて補助関数を呼び分ければいい
簡単化しすぎて何を質問したいのかよくわからない
その例の程度の処理なら、intとdoubleの関数をオーバーロードして、template関数でデフォルトの処理も書けばいい
intとdoubleをどうしてもtemplate化したかったら特殊化で書けばいい
前後に長い共通処理がある場合の一部式だけ個別にしたいなら、関数オブジェクトで式を引数にとる補助template関数作って、上記手法で型毎にlambdaで式を変えて補助関数を呼び分ければいい
467デフォルトの名無しさん
2019/03/19(火) 00:56:32.83ID:wfF3ncvB >>466
特殊化する部分を関数として切り出して特殊化すれば良いということでしょうか。
特殊化する部分を関数として切り出して特殊化すれば良いということでしょうか。
468デフォルトの名無しさん
2019/03/19(火) 06:48:59.95ID:smCJKSpo >>450
まずは、エラーなくコンパイルが通って実行できるまで。
単純には、比較関数をクラスの外に出して「メンバ関数じゃない関数」にする。
たぶんソートしたいクラス中には比較する文字列以外のメンバもあるだろうから、
class myclass {
public:
string s; // 比較対象の文字列
int other; // それ以外のメンバ例
... // 他にもメンバ色々
};
こんな感じだと思う。
比較関数は、2つの myclass 型のオブジェクトのメンバ s 同士を比較するから、
bool mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
まずは、エラーなくコンパイルが通って実行できるまで。
単純には、比較関数をクラスの外に出して「メンバ関数じゃない関数」にする。
たぶんソートしたいクラス中には比較する文字列以外のメンバもあるだろうから、
class myclass {
public:
string s; // 比較対象の文字列
int other; // それ以外のメンバ例
... // 他にもメンバ色々
};
こんな感じだと思う。
比較関数は、2つの myclass 型のオブジェクトのメンバ s 同士を比較するから、
bool mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
469468
2019/03/19(火) 06:54:39.65ID:smCJKSpo あるいは >>468 の段階はすでに通過してて、
「今度は比較関数をクラスのメンバ関数にしてみよう」と思ったのかな。
bool mycomp(string a, string b);
このプロトタイプでクラスの「staticでないメンバ関数」にすると、
その関数はクラスのオブジェクトを介して obj.mycomp((string)a, (string)b)
という形で呼び出さなきゃならないのよ。
ところが std::sort() が比較関数を呼び出す場合は
どのオブジェクトとも関係ない mycomp((string)a, (string)b) を呼ぼうとする。
「クラスのメンバだけど、クラスの個々のオブジェクトからは独立した関数」に
するために、関数の宣言に static を指定する。
class myclass {
public:
string s; // 比較対象の文字列
int other; // それ以外のメンバ例
... // 他にもメンバ色々
static bool mycomp(const myclass& a, const myclass& b); // 比較関数
};
(「改行多すぎ」につき、もう一回だけつづく)
「今度は比較関数をクラスのメンバ関数にしてみよう」と思ったのかな。
bool mycomp(string a, string b);
このプロトタイプでクラスの「staticでないメンバ関数」にすると、
その関数はクラスのオブジェクトを介して obj.mycomp((string)a, (string)b)
という形で呼び出さなきゃならないのよ。
ところが std::sort() が比較関数を呼び出す場合は
どのオブジェクトとも関係ない mycomp((string)a, (string)b) を呼ぼうとする。
「クラスのメンバだけど、クラスの個々のオブジェクトからは独立した関数」に
するために、関数の宣言に static を指定する。
class myclass {
public:
string s; // 比較対象の文字列
int other; // それ以外のメンバ例
... // 他にもメンバ色々
static bool mycomp(const myclass& a, const myclass& b); // 比較関数
};
(「改行多すぎ」につき、もう一回だけつづく)
470468
2019/03/19(火) 06:57:01.64ID:smCJKSpo (>>469 の続き、長々とすまぬ)
関数の定義(クラス定義の外に書く場合)はこんな感じ。
bool myclass::mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
myclass のメンバ関数だと明示するために myclass:: をつけることと、
定義の方には static をつけない、てところが注意点。
std::sort() で使う時は、
std::sort(std::begin(objs), std::end(objs), myclass::mycomp);
「比較関数には myclass のメンバ関数の mycomp() を使ってくれ」と明示。
…する必要が(俺の環境では)あるんだけど、myclass 同士を比較することから、
自動的に myclass のメンバ関数も候補に入れてくれても良さそうな気がする。
なんでダメなんだろ?
関数の定義(クラス定義の外に書く場合)はこんな感じ。
bool myclass::mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
myclass のメンバ関数だと明示するために myclass:: をつけることと、
定義の方には static をつけない、てところが注意点。
std::sort() で使う時は、
std::sort(std::begin(objs), std::end(objs), myclass::mycomp);
「比較関数には myclass のメンバ関数の mycomp() を使ってくれ」と明示。
…する必要が(俺の環境では)あるんだけど、myclass 同士を比較することから、
自動的に myclass のメンバ関数も候補に入れてくれても良さそうな気がする。
なんでダメなんだろ?
471デフォルトの名無しさん
2019/03/19(火) 07:25:56.87ID:aaAbvqyx たかがソート一つ実行するのにこれってやっぱc++は失敗しとるわ。。
472デフォルトの名無しさん
2019/03/19(火) 07:30:30.93ID:/K8ycOQq どの言語も似たようなもんだろ
473デフォルトの名無しさん
2019/03/19(火) 07:31:18.45ID:K4E5ztRO >>468-470
丁寧に教えてくださりありがとうございます。
今のところは、>>468に書かれているようにクラスの外に出す、という方針で対応しておりました。
クラスの中で static をつけて宣言をする、というのが元々やりたかったことに一番近いように思います。重ね重ねありがとうございます。
>>470
> std::sort() で使う時は、
> std::sort(std::begin(objs), std::end(objs), myclass::mycomp);
> 「比較関数には myclass のメンバ関数の mycomp() を使ってくれ」と明示。
これは、mycomp() をクラス内で非static に宣言したときにも使えますか。
それとも、クラスの外で
bool myclass::mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
流に宣言、定義した場合に限りますか。
丁寧に教えてくださりありがとうございます。
今のところは、>>468に書かれているようにクラスの外に出す、という方針で対応しておりました。
クラスの中で static をつけて宣言をする、というのが元々やりたかったことに一番近いように思います。重ね重ねありがとうございます。
>>470
> std::sort() で使う時は、
> std::sort(std::begin(objs), std::end(objs), myclass::mycomp);
> 「比較関数には myclass のメンバ関数の mycomp() を使ってくれ」と明示。
これは、mycomp() をクラス内で非static に宣言したときにも使えますか。
それとも、クラスの外で
bool myclass::mycomp(const myclass& a, const myclass& b)
{
return a.s < b.s; // 辞書式の昇順
}
流に宣言、定義した場合に限りますか。
474デフォルトの名無しさん
2019/03/19(火) 07:33:59.57ID:LjcR+vA2 何のために非staticにこだわるんだ?
メンバにアクセスしないならstaticつけとけよ
メンバにアクセスしないならstaticつけとけよ
475デフォルトの名無しさん
2019/03/19(火) 08:36:28.37ID:I3ez8Qch 比較関数をメンバ関数としてクラスに内在させるのが良くない
外部化するか、演算子オーバーロードする
どちらかと言うと比較関数を作らずに大小関係を定義する言語だ
実は、関数やクラスの間の包含関係がある
クラスを比較する関数はクラスの外部におかれるべきであって、メンバ関数にするのは筋が悪い
クラス内部に置くなら大小関係の定義にすべきだ
この手の階層関係は、規格書にもどんな教科書にも一切書かれてないけど、暗黙のうちに了解されている
外部化するか、演算子オーバーロードする
どちらかと言うと比較関数を作らずに大小関係を定義する言語だ
実は、関数やクラスの間の包含関係がある
クラスを比較する関数はクラスの外部におかれるべきであって、メンバ関数にするのは筋が悪い
クラス内部に置くなら大小関係の定義にすべきだ
この手の階層関係は、規格書にもどんな教科書にも一切書かれてないけど、暗黙のうちに了解されている
476デフォルトの名無しさん
2019/03/19(火) 09:31:11.81ID:wYd+ZeEZ 対称な演算子をインスタンスメンバにするのはセンス無いね
477デフォルトの名無しさん
2019/03/19(火) 15:31:26.82ID:Pb8DX7io >>463
template <typename T>
T func(T a) {
if constexpr (std::is_same_v<T, int>) return a * 2;
else if constexpr (std::is_same_v<T, double>) return a / 2;
else return a;
}
template <typename T>
T func(T a) {
if constexpr (std::is_same_v<T, int>) return a * 2;
else if constexpr (std::is_same_v<T, double>) return a / 2;
else return a;
}
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【和訳付き】レーダー照射問題 中国軍と自衛隊との“音声データ”公開 中国国営メディア [♪♪♪★]
- 「中国側も日本機のレーダーを感知していた」 中国メディアが報道 [♪♪♪★]
- 【YouTuber】バイク事故で入院のゆたぼん、振込で「お見舞金」募る [muffin★]
- 堀江貴文、キャッシュレス非対応の店にモヤッ 『PayPay』立ち上げの人物にまさかの直談判「現金決済しかできないんだけど…」 [冬月記者★]
- 高市早苗首相、消費税減税に後ろ向き 足かせはレジシステム? 「責任ある積極財政」期待高いが [蚤の市★]
- 空自機レーダー照射、音声データ公開 中国 ★2 [蚤の市★]
- 【悲惨】中国軍が自衛隊に「事前通告」し自衛隊も返答した音声が公開されてしまうwwwこれは高市チェックアウトゕ★2 [597533159]
- 【悲惨】中国軍が自衛隊に「事前通告」し自衛隊も返答した音声が公開されてしまうwwwこれは高市チェックアウトゕ★3 [597533159]
- 【悲報】JA「全然米が売れなくて倉庫を圧迫してる。助けて!」米卸売り業者「安売りしたら赤字になる…助けて!」 [802034645]
- 【悲報】日本人「大日本帝国はアジア諸国を解放した。現地民は自分で独立も達成できないヘタレwww」 [354616885]
- フェラシーンって勃起するもんなの?
- 高市早苗「そんなことになってんの?!」👈驚いたこと [931948549]
