[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 10/30 03:13 / Filesize : 322 KB / Number-of Response : 1026
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part129



1 名前:デフォルトの名無しさん(ワッチョイ dfcf-HvS5) mailto:sage [2017/01/09(月) 14:49:27.56 ID:p96WJVyd0.net]
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part128
echo.2ch.net/test/read.cgi/tech/1480172629/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
echo.2ch.net/test/read.cgi/tech/1478440682/

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

620 名前:デフォルトの名無しさん (ワッチョイ 1fa9-sdpt) mailto:sage [2017/03/08(水) 21:28:15.23 ID:LYwYML6D0.net]
>>602
C の syntax を↓で済ませた結果、各 specifier, qualifier は順不同となった。
declaration:
 declaration-specifiers init-declarator-list(opt);
declaration-specifiers:
 storage-class-specifier declaration-specifiers(opt)
 type-specifier declaration-specifiers(opt)
 type-qualifier declaration-specifiers(opt)

621 名前:デフォルトの名無しさん (ワッチョイ af3c-csvI) mailto:sage [2017/03/09(木) 08:16:39.62 ID:P4eVvEWq0.net]
「cv修飾は左を修飾し、一番左に書いたときだけ例外的に右を修飾する」
という認識で10年以上問題なかった、仕様書でどうなってるかは知らんけど

622 名前:デフォルトの名無しさん (オッペケ Sr57-Yz8R) mailto:sage [2017/03/09(木) 08:46:08.19 ID:nspN5S3gr.net]
そんなはずもなし
unsigned volatile const inline int static long *f();

623 名前:デフォルトの名無しさん (ワッチョイ 2353-pXJL) mailto:sage [2017/03/10(金) 02:51:41.08 ID:DVnkldFi0.net]
>>602
>const int *p
>はやらない、これっていったい上の三つのうちのどれになるの?なんでそうなるの?

マジか const char * なんて毎日数え切れないほど使ってるわ

624 名前:デフォルトの名無しさん (ワッチョイ cff2-j8zu) [2017/03/10(金) 08:56:27.34 ID:B+GguKA+0.net]
const v(^・^)v const

625 名前:デフォルトの名無しさん (ササクッテロル Sp57-f3f6) mailto:sage [2017/03/10(金) 17:04:19.46 ID:Pyfb9YNwp.net]
久々にC弄ったから何となく覗いてみたらconstの話しかしてなくて草

626 名前:デフォルトの名無しさん (ワッチョイ 362b-2hGO) mailto:sage [2017/03/10(金) 18:09:34.58 ID:wy5WfeUq0.net]
const仙人のお出ましだぞ
彼がconstの全てを知ってるらしい

627 名前:デフォルトの名無しさん (オッペケ Sr57-Yz8R) mailto:sage [2017/03/10(金) 18:35:53.93 ID:9izzFXDGr.net]
>>585
>同じ型だけどconst性の違いがある

どこでそんなデタラメを覚えた?

628 名前:デフォルトの名無しさん (ワッチョイ 72cc-hLcU) mailto:sage [2017/03/10(金) 18:47:49.20 ID:OJfHMNpa0.net]
君達、物事はコンスタントに解決することが重要だよ?わかてる?



629 名前:デフォルトの名無しさん (オッペケ Sr57-Yz8R) mailto:sage [2017/03/10(金) 19:03:11.58 ID:9izzFXDGr.net]
>>598
>constは後ろに付けるのが本来なんだよ

ソースは?

630 名前:デフォルトの名無しさん (ワッチョイ f27f-uSLp) mailto:sage [2017/03/10(金) 19:23:12.52 ID:ZjsFj1+i0.net]
>>614
後者では型が修飾されているんじゃなくて変数が const 修飾されている
ということを言いたかったんじゃない?実際

int * a;
int * const b = hoge();
a = b;

はちゃんと通るし。
まあたしかに「同じ型」だと言っていいのかはよくわかんないけど。

631 名前:デフォルトの名無しさん (ドコグロ MMca-TLcY) mailto:sage [2017/03/10(金) 20:18:18.69 ID:HUvVedpnM.net]
>>603のClockwise/Spiral Ruleに異論のある人、居る?

632 名前:デフォルトの名無しさん (ブーイモ MM2b-4Oo7) mailto:sage [2017/03/10(金) 20:38:11.10 ID:K2NxcqGZM.net]
>>618
1つ目の回答のほうが2つ目の回答(スパイラル)より12倍投票数が多いぞ

633 名前:デフォルトの名無しさん (オッペケ Sr57-Yz8R) mailto:sage [2017/03/10(金) 20:56:02.79 ID:9izzFXDGr.net]
>>617
>型が修飾されているんじゃなくて変数が const 修飾されている

などという空想がどこから湧いてきたのか疑問なのだが
ideone.com/dWfpAT

634 名前:デフォルトの名無しさん (オッペケ Sr57-Yz8R) mailto:sage [2017/03/10(金) 20:59:13.64 ID:9izzFXDGr.net]
>>618
まず「clockwise」と言うあたりでオツムが論理的思考に弱いことは明らか

635 名前:デフォルトの名無しさん (ワッチョイ 72c9-qJ3d) mailto:sage [2017/03/10(金) 21:00:42.90 ID:6ypCkPMo0.net]
>>617の理屈だと、
char c;
int i;

これらは同じ型で変数が修飾されてるだけだよ。
実際、

int i;
char c = 3;
i = c;

はちゃんと通るし。
などとも言える。

636 名前:デフォルトの名無しさん (ワッチョイ 723c-ezmg) mailto:sage [2017/03/10(金) 22:22:44.73 ID:PT1UnLZa0.net]
>>620
int const *p
int * const p
の違いもわからんアホは ROM っとけ

637 名前:デフォルトの名無しさん (ワッチョイ 52c0-/Xhi) mailto:sage [2017/03/11(土) 00:12:59.12 ID:XUJAp/M10.net]
ROMはconst

638 名前:デフォルトの名無しさん (ワッチョイ 138b-ldtI) mailto:sage [2017/03/11(土) 06:32:47.43 ID:JvHBeRgs0.net]
ちょっおまwwwwwwww
C++のBNFにtype-qualifierというのはあっても
variable-qualifierとかobject-qualifierとかは無いはず…
>>622のは単に変数のdeclaration
(文脈によっては変数の定義にもなる



639 名前:デフォルトの名無しさん (ワッチョイ d2d1-qBYI) mailto:sage [2017/03/11(土) 06:50:46.51 ID:2/ZkR35y0.net]
ちょっおま
って久しぶりに聞いたわ

640 名前:デフォルトの名無しさん (ワッチョイ 7f4a-/Xhi) mailto:sage [2017/03/11(土) 09:06:46.34 ID:h5T3JHpB0.net]
>>616
二度漬け禁止

641 名前:デフォルトの名無しさん (ワッチョイ f64a-JiRs) mailto:sage [2017/03/12(日) 07:41:49.43 ID:nkYFQTVc0.net]
Visual studio express 2013において、if文以外(変数にデータを代入するとき)に==と書いた時にエラーを返すようにしたいのですが、出来ますか?
(a == 1;と書いた時にコンパイルするとエラーを返すようにするといった感じです)
if文の判定式をコピーした結果、この==を1つにし忘れたため、しばらく困ったのと
現状において、整数への代入で==を使うことが無いので、エラーを出すようにしたいのです

642 名前:デフォルトの名無しさん (ワッチョイ f64a-JiRs) mailto:sage [2017/03/12(日) 08:58:04.75 ID:nkYFQTVc0.net]
すみません、スレ違いでした

643 名前:デフォルトの名無しさん (ワッチョイ 723c-4mgA) mailto:sage [2017/03/12(日) 09:50:45.60 ID:6iMHIBm50.net]
>>628
プロジェクトのプロパティ
>構成プロパティ >C/C++ >詳細設定
特定の警告をエラーとして扱う に 4553 を設定すればいい
(もしくは、コンパイルオプションの /we"4553" を指定)

そうすると
warning C4553: '==': 演算子にプログラム上の作用がありません。'=' を意図しましたか?
のエラーになる。

644 名前:デフォルトの名無しさん (ワッチョイ 138b-ldtI) mailto:sage [2017/03/12(日) 12:13:57.19 ID:OaInj5Km0.net]
「警告レベル」を「Level4 (/W4)」、「警告をエラーとして扱う」を「はい (/WX)」にしたらもっと広範にやってくれてスゲー便利

645 名前:デフォルトの名無しさん (ワッチョイ f64a-JiRs) mailto:sage [2017/03/12(日) 17:42:24.65 ID:nkYFQTVc0.net]
>>630,631
本当に有難う御座いました!!
c++に明るくなく、これに気づかなかったせいで丸三日潰れて困り果てていたのですが、c++系の専門用語が分か

646 名前:轤ネいのと
「c++ ==」といったワードで検索しても記号系のワードが省かれるからか、ヒットせずとても困っていました
[]
[ここ壊れてます]

647 名前:デフォルトの名無しさん (スプッッ Sdb2-K8Mp) mailto:sage [2017/03/13(月) 07:13:56.93 ID:Butu4pJYd.net]
MultiByteToWideCharの1つ目の引数のコード表と二つ目の引数のフラグセットの意味を教えてくれませんか
コード表の意味はなんとなくわかるんだけどそれが使用してたコード表についてなのか、それとも変換先なのかがわからない...

648 名前:片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd92-SsNB) mailto:sage [2017/03/13(月) 13:07:11.48 ID:VNPYsRzKd.net]
>>633
WindowsのUnicodeには、UTF-16が使われている。コードページは、UTF-16以外のマルチバイト文字列の符号化の種類を表している。第2引数についてはUnicodeの基本を勉強してから用語を確認せよ(英語のMSDNページを参照)。



649 名前:デフォルトの名無しさん (ワッチョイ f3c9-Yz8R) mailto:sage [2017/03/13(月) 16:29:57.33 ID:Kr7xjXLG0.net]
Unicode 9.0のCore Specification D63ではprecomposedとcompositeが同義と読めるがMSDNは異なる使い方をしているな
combining(結合)と間違えたように思える
これでは>>633は理解不能

650 名前:デフォルトの名無しさん (ワッチョイ f3c9-Yz8R) mailto:sage [2017/03/13(月) 21:12:59.84 ID:Kr7xjXLG0.net]
>>633
WindowsのMultiByteToWideCharは「何らかの文字コード」をwchar_t(UTF-16)文字列に変換するもの
変換元の文字コードが何であるかを指定するのが第一引数
例えば932(シフトJIS)、65001(UTF-8)
変換の動作を指定するのが第二引数
例えばMB_ERR_INVALID_CHARSは少しでも不正なバイトシーケンスがあれば全体をエラーとする

651 名前:デフォルトの名無しさん (ワッチョイ f27f-6H1t) mailto:sage [2017/03/15(水) 02:37:25.64 ID:8rrA/zgU0.net]
>>620
ってどういう意図のレスだったの?理解がまったくできないんだけど

652 名前:デフォルトの名無しさん (スプッッ Sdb2-K8Mp) mailto:sage [2017/03/15(水) 17:59:26.07 ID:wfaQCMr9d.net]
>>634-636
たすかりもうした
おかげでコード上手くかけたので助かりました

653 名前:デフォルトの名無しさん (ワッチョイ 133c-v8EU) [2017/03/16(木) 18:08:57.23 ID:KOsUwnSu0.net]
テンプレートの特殊化を勉強しているんだけど
https://ideone.com/Z7enCI
これがなんでエラーになるのか教えてください

654 名前:デフォルトの名無しさん (ワッチョイ ef6c-i8cA) mailto:sage [2017/03/16(木) 18:18:50.30 ID:ZMIdRLMQ0.net]
>>639
intのHogeのFoo関数のtemplate<>が余計
Hoge<int>が特殊化されていることはクラス側でわかっているため

655 名前:デフォルトの名無しさん (ワッチョイ 133c-v8EU) [2017/03/16(木) 19:00:18.20 ID:KOsUwnSu0.net]
>>640
なるほど、サンクス

656 名前:デフォルトの名無しさん (ワッチョイ 133c-v8EU) mailto:sage [2017/03/17(金) 09:32:55.95 ID:OqtFMBfF0.net]
関数のアドレスを取得するときに
クラスのメンバじゃない普通の関数は&をつける必要がないのに
メンバ関数は&をつけないといけなくなる理由を教えて

657 名前:デフォルトの名無しさん (ワッチョイ 5319-v8EU) mailto:sage [2017/03/17(金) 09:40:10.52 ID:Wd4E8hAa0.net]
ideoneで書いてると急に初期化されて初めの状態のコードに戻ってしまうのですが
わたくしだけでしょうか?

658 名前:デフォルトの名無しさん (スップ Sddf-8YZg) mailto:sage [2017/03/17(金) 11:36:52.60 ID:c9xwv7oqd.net]
>>642
言ってる意味がよくわからん



659 名前:デフォルトの名無しさん (ワッチョイ 3fdf-8FG5) [2017/03/17(金) 13:16:36.04 ID:AO+9LJwo0.net]
>>642
ドライに言うと、規格でそう決まっているから

なんでそう決まっているかというと、
メンバポインタ(関数に限らない)取得は特殊な行為で、
インスタンス内のメンバの絶対アドレスを取得するが一般的な行為*1なので、
特殊な行為は明示的*2に書こうということになっている

struct asshole
{
void sonofabitch(int) { }
void dipshit()
{
auto jerk = sonofabitch;
}
};
↑は現実にはコンパイルエラーだが、もし通すとしたら
おまえ的にはjerkには何が入るべきだと思う?
ちなみに俺はbind(&asshole::sonofabitch, this, _1)に見えちまう

*1 俺じゃなく禿がそう思っている
*2 アドレス演算子とスコープ演算子が必須

660 名前:デフォルトの名無しさん (ワッチョイ bf27-tpgq) mailto:sage [2017/03/17(金) 13:48:45.02 ID:l8NCqXAU0.net]
どこをどうひねるとそういう煌びやかな単語が出てくるのかが謎

661 名前:デフォルトの名無しさん (ワッチョイ 5319-v8EU) mailto:sage [2017/03/17(金) 16:09:10.13 ID:Wd4E8hAa0.net]
ダブルヂスパッチってwikipediaだと2つのオブジェによってヂスパッチ
する意味ってかいてあるけれどwikipedia以外のホムペには2回ヂスパッチすること
って書いてあるばあいもありますね。

662 名前:デフォルトの名無しさん (ドコグロ MMb7-3fK7) mailto:sage [2017/03/17(金) 18:32:57.86 ID:dpI1G6OFM.net]
>>645
日本語がまともに書けるようになってからレスしなよ

663 名前:デフォルトの名無しさん (ワッチョイ bfda-8FG5) [2017/03/17(金) 19:46:28.78 ID:sgxnbWig0.net]
>>648
おまえは批判がまともに書けるようになるまでROMってろ

664 名前:片山博文MZ ◆T6xkBnTXz7B0 (スププ Sddf-W8JT) mailto:sage [2017/03/17(金) 19:54:05.38 ID:+s8GChIVd.net]
批判

665 名前:デフォルトの名無しさん (ワッチョイ bf3c-5NuA) mailto:sage [2017/03/17(金) 19:59:12.76 ID:KNcySIzq0.net]
>>648
俺は普通に理解できたんだが、逆になにが悪いのか教えて欲しい。

666 名前:デフォルトの名無しさん (ブーイモ MM37-nFTW) mailto:sage [2017/03/17(金) 21:49:19.82 ID:YstDK/amM.net]
メンバー関数のアドレス取得も絶対アドレスだと思うんだけど

667 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/17(金) 22:10:36.61 ID:Kkd83n1s0.net]
>>646
○○がマイブームな年頃

うんち:3さい
カンチョー:6さい
サノバビッチ:14歳←英語使ってる俺カッコイイ

とかじゃね?


ところで脱線するが、>>645でbindがC++にあることを初めて知ったのだが、
thisをバインド出来ているがこれって意味あるのか?
JavaScriptみたいな動的ダックタイピングなら継承関係なくbind出来るので意味があるのだが、
C++なら継承してないとbind出来ないよな?
だったら最初からインスタンスのポインタを管理して普通にメンバ呼んだ方が楽だと思うが。
(継承してないとbind出来ないのなら管理対象のポインタが
関数ポインタになるかインスタンスになるかだけ。
実質的なプログラミングコストは変わらない)

668 名前:デフォルトの名無しさん (ワッチョイ 133c-v8EU) [2017/03/17(金) 22:24:44.25 ID:OqtFMBfF0.net]
>>645
ごめん、bind関数の理解があいまいなんだが
要するにインスタンス先のsonofabitchメンバ関数になるように見えるって言いたいんだよね
俺は(も?)そう思った
でも規格で決まってるって一言で言ってもらえてなんとなく割り切れた

ひとつだけ
「インスタンス内のメンバの絶対アドレスを取得する」のが特殊な行為って部分をkwsk
他のポインタは相対アドレスなの?



669 名前:デフォルトの名無しさん (ワッチョイ 3398-jYbd) mailto:sage [2017/03/17(金) 22:41:33.75 ID:pMlN+j4d0.net]
いやでも、原文には
>インスタンス内のメンバの絶対アドレスを取得するが「一般的」な行為
って書いてあるし

670 名前:デフォルトの名無しさん (オッペケ Sr97-w0Gz) mailto:sage [2017/03/17(金) 23:23:01.06 ID:p3X8pgmur.net]
>auto jerk = sonofabitch;

ここは話の流れでは
auto jerk = asshole::sonofabitch;
とすべき所を、勝手に「asshole::」を取って話をすり替えるとは

671 名前:デフォルトの名無しさん (ワッチョイ a342-W3uL) mailto:sage [2017/03/17(金) 23:23:58.39 ID:lHYxcE7d0.net]
>>653
transformみたいなアルゴリズム系の関数に渡すときにバインドするしかないだろ

672 名前:デフォルトの名無しさん (ワッチョイ 3fd1-h49x) mailto:sage [2017/03/17(金) 23:46:36.67 ID:KqZX+Igl0.net]
継承してなくてもbindできるでしょ

673 名前:デフォルトの名無しさん (ワッチョイ 537b-gO1F) [2017/03/17(金) 23:48:26.71 ID:RKn5d9hw0.net]
継承とbindがどう関係すんのか解らんわ

674 名前:デフォルトの名無しさん (オッペケ Sr97-w0Gz) mailto:sage [2017/03/18(土) 09:12:06.02 ID:QtoorQPlr.net]
>>653
>C++なら継承してないとbind出来ないよな?

継承の意味もわからないレベルはすっこんでた方がいい
ideone.com/Wl7A59

675 名前:デフォルトの名無しさん (ワッチョイ f3e7-ajdi) mailto:sage [2017/03/18(土) 09:44:46.57 ID:g4V8rpJk0.net]
ふえーん。VC++でW系のこーどがわからないよ〜。

676 名前:デフォルトの名無しさん (ワッチョイ f3e7-ajdi) mailto:sage [2017/03/18(土) 09:54:09.70 ID:g4V8rpJk0.net]
C++のバグかと思ったら、いじってるHTMLのバグだった。悲しい。

677 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 11:02:56.09 ID:waR+gchT0.net]
>>657
std::transformならbindいらんだろ。イテレータを渡してる。
> https://cpprefjp.github.io/reference/algorithm/transform.html
そしてこの場合、(someClass->*someMethod) と書けるしそれで十分だろ。

>>660
ここでbindも継承もないソースを上げてくることにびっくりだわ

>>658-659
関数内でのthis.someFieldへのアクセスは継承してないと無理でしょ。
静的型ではポインタを生成出来ない。(動的ダックタイピングなら可能)
www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03057.html
www.ibm.com/support/knowledgecenter/ja/SSGH3R_12.1.0/com.ibm.xlcpp121.aix.doc/language_ref/cplr034.html

継承してない物をbindして、その関数内からthis.someFieldにアクセス出来る例があるか?
あればよろしく。

678 名前:デフォルトの名無しさん (ワッチョイ 838b-UnlH) mailto:sage [2017/03/18(土) 11:43:31.57 ID:YXP7lJmh0.net]
ていうか仮想関数(による多態性)とテンプレート(によるfunctor)がどっちも使える状況で
どうしてもメンバ関数のアドレスをとる必要があるというシチューエーションとは一体、
ちなメンバ関数のアドレスをとる構文は覚えていない
主記憶にございません



679 名前:デフォルトの名無しさん (ワッチョイ 838b-UnlH) mailto:sage [2017/03/18(土) 11:45:58.26 ID:YXP7lJmh0.net]
誤:テンプレート(によるfunctor)
正:テンプレート(へのfunctorとかクロージャ渡し)

680 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 12:01:44.38 ID:TmvAgLdoM.net]
>>663
もういいから死ね
https://ideone.com/jZNd95

681 名前:デフォルトの名無しさん (ワッチョイ 838b-UnlH) mailto:sage [2017/03/18(土) 12:41:56.92 ID:YXP7lJmh0.net]
f.calc(x, 2)をfunc(x)として呼びたいためだけにstd::bind()を使うのはメリット感に欠ける…

682 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 12:43:09.53 ID:TmvAgLdoM.net]
>>667
できるできないの議論だから

683 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 12:48:15.84 ID:waR+gchT0.net]
>>666
> std::vector<int> invoke(const std::vector<int>& v, const F& f) const
> std::bind(&F::calc, f, _1, 2));
bindしている対象は F& f つまり自分自身のクラスだろ。
それは継承してるのと意味は同じだよ。(今回の問いにおいては)
俺はそこに全く無関係のクラス class G{} を突っ込めるのかと問うている。
C++では出来ないだろ。(JavaScriptでは出来る)

自分自身、または継承関係のあるクラスなら、
> std::bind(&F::calc, f, _1, 2));
のところを代わりに f->*calc と書けるんだよ。それでいいだろ、という話。
今回は引数が複数個で、第2引数を確定させたいみたいだから、
C++にその文法が無く、部分適用関数をあらかじめ用意するしかないようだけど、
それは文法が足りてないから。(ただしそこまで使わないのでbindでもいいが)

ただそもそもカリー化して一個ずつ食えって話だろ、本来は。
その場合なら第2引数を確定させた関数を作る為に、
class H: F{
int k;
int calc(const int x);
}
だろ。それで h->*calcで良いんだよ。(継承関係が有ればbind無しで書ける)
というか内部的には同じ事をやっていると思っているんだが。

684 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 12:48:34.92 ID:waR+gchT0.net]
それで話を戻すと、
「継承関係無しで、自分自身でもないクラス G をbind出来るか?」
というのが俺の問いね。
お前は日本語にもこだわるタイプのようだから、「自分自身でもない」と明記しておく。
(これは普通に分かると思いたかったが)

要するに俺は、
「静的型であるC++に於いてthisのバインドって意味あるのか?」
と問うている。
動的型ならバインド後にメンバ追加して実行時に揃っていればダックタイピング可能だから意味がある。
静的型はバインドする時点でメンバが揃っていることを確定出来ないといけない。
それって要するに継承関係がないと無理だよね?という話。

685 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 12:51:40.31 ID:waR+gchT0.net]
× 静的型はバインドする時点で
○ 静的型はバインドが使われているソースをコンパイルする時点で

一応訂正しとくわ。分かる範囲だとは思うが。

686 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 13:01:24.39 ID:TmvAgLdoM.net]
何が言いたいのか全然わからん
とりあえず、そのJavaScriptでできると主張しているコードを晒せ

第一引数にthisをバインドする意味って、内部的にはメンバメソッドはオーバーロード(+マングリング)で解決されるんだから、バインドしとかないと動かねーだろがよ

687 名前:デフォルトの名無しさん (ワッチョイ 2322-ghbJ) mailto:sage [2017/03/18(土) 13:17:03.94 ID:WJ1Bgcsq0.net]
std::list<std::function<void<void>>> funcs;

A a;
B b;

callbacks.push_back(std::bind(&A::func, &a));
callbacks.push_back(std::bind(&B::f, &b));

for(auto func : ...) func();

こういう使い方のbindの場合継承は関係ないと思う

688 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 13:31:02.22 ID:waR+gchT0.net]
>>672
> バインドしとかないと動かねーだろがよ
その通りだ。
多分君はC++しか知らないから、それ前提で話をしているからそう思えるのだと思う。
これ自体は不思議ではない。

JavaScriptなら以下みたいなことが出来る。

var a = {
a: 1,
k: 2,
calc: function(x){return this.k*x+this.a;}
};
var b = {}; // bはaと継承関係なし

var b_calc = a.calc.bind(b); // aのcalcにbをバインド ---(A)
b_calc(3); // 実行可能、結果は NaN ---(B)
b.a = 4;
b.k = 5;
b_calc(6); // 実行可能、結果は 34 ---(C)



689 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 13:31:20.02 ID:waR+gchT0.net]
C++から見ればデタラメだが、JavaScriptはこれでも動く。
C++は(A)の時点でバインド対象(今回はb)がcalcを動かしても問題ないことが必要で、
コンパイル時に確定させる為には通常は継承関係がないと無理だろ。
JavaScriptはそういうの関係無しにとりあえずbind出来る。
ただし中身が揃っていない時に実行したらNaNが返ってくる。(B)
そして中身を揃えたあとには正しく実行される。(C)

だからJavaScriptみたいな言語ならthisをバインドする意味があるのだが、
C++のように継承関係がないとメンバ関数を呼べないのなら、
常に f->*calc の形で記述することが可能であり、bind時にthisを確定させる意味がない。
(やってもいいのだが、冗長=糖衣構文)

JavaScriptでは(B)の時点で b はメンバを何も持っておらず、
(C)の時点でもメンバは a, k のみで、calcはメンバではないことに注意。
(当たり前だが a を継承していれば calc もメンバになる)

690 名前:デフォルトの名無しさん (ワッチョイ 537b-gO1F) [2017/03/18(土) 13:32:09.09 ID:ux+WuUO90.net]
>>670
thisに限らずbindするメリットは呼び出し側が(bindで引数を合わせることにより)実際に呼び出される物がどんな関数のか気にせずに呼び出せることっていうのは解るよね?
それで、thisのbindだけ疑問視する理由は?

691 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 13:38:41.49 ID:waR+gchT0.net]
>>673
> callbacks.push_back(std::bind(&A::func, &a));
これを、this側が関係ない奴、例えばBにして、

callbacks.push_back(std::bind(&A::func, &b)); // (D)

だとコンパイル通らないだろ?(俺の予想だが)
だったら、常にその場合は、

callbacks.push_back(a->*func));

と書けるよね?という話。
(もちろん糖衣構文ならそれでいいんだが)

JavaScriptは(D)でも

692 名前:Rンパイル通るんだよ。(まあコンパイル自体がないんだが)
そして実行も出来る。(ただし実行時にメンバが揃ってない時にはお察しで)
[]
[ここ壊れてます]

693 名前:デフォルトの名無しさん (ワッチョイ 537b-gO1F) [2017/03/18(土) 13:48:07.93 ID:ux+WuUO90.net]
>>677
つまり
>callbacks.push_back(a->*func))
と書けるようにしたらbindでthis使う必要ないって話?
そうなのであれば
callbacks.push_back([&]{a.func();});
と書けるから別に要らない

694 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 13:53:42.63 ID:waR+gchT0.net]
>>676
見やすさの為に、というのはいい。

> thisのbindだけ疑問視する理由は?
プログラミングコストが減ってないから。
auto a_func = std::bind(&A::func, &a) なら、
a を管理するか a_func を管理するかで、何も隠蔽出来てないし減ってない。

ただ>>673みたいな使い方だと、
型を揃えた結果、同じ記述で実行出来るから、この点は確かにメリットはある。
これを言いたかったのか?

695 名前:デフォルトの名無しさん (ワッチョイ 537b-gO1F) [2017/03/18(土) 13:59:12.74 ID:ux+WuUO90.net]
>>679
bindを使う利点なんてそれしか無いと思うんだけど…

696 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 14:02:09.89 ID:TmvAgLdoM.net]
>>674
C++では、お前があとからやってるインスタンス構築を先にやっとけよってだけの話

697 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 14:03:34.16 ID:TmvAgLdoM.net]
>>679
type_erasureの話がしたかっただけ?
C++のこと知らねーなら議論の余地がなさすぎ
JavaScriptスレいけよ

698 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 14:04:04.03 ID:waR+gchT0.net]
>>678
ちょっと輻輳してて申し訳ないが、

> >callbacks.push_back(a->*func))
> と書けるようにしたらbindでthis使う必要ないって話?
そう。というか継承関係ある状態でしかメンバ関数使えないのなら、
thisをbindする意味がないと思った。
(引数はbindしていいが、これもbindなしで継承でも書ける>>669

ただし、>>673みたいに、「戻り値と引数が同じなら同じ関数型」として扱えるのなら、
継承関係なしのA::funcとB::funcを同じに扱えるからやっぱbindしてないと駄目だな。


ところで、ここでクロージャを使うことに意味はあるのか?
> callbacks.push_back([&]{a.func();});
もちろん使ってもいいが、a.funcがクロージャ内の変数を捕捉しているはずもないし、直接
> callbacks.push_back(a->*func));
で全く問題なくね?



699 名前:デフォルトの名無しさん (ワッチョイ 2322-ghbJ) mailto:sage [2017/03/18(土) 14:06:49.68 ID:WJ1Bgcsq0.net]
正直
std::function<...> f[] = a.func;
で書けるなら書きたい
書けないからbind使ってる

700 名前:デフォルトの名無しさん (ワッチョイ 2322-ghbJ) mailto:sage [2017/03/18(土) 14:07:07.58 ID:WJ1Bgcsq0.net]
[]いらない

701 名前:デフォルトの名無しさん (ワッチョイ a30e-BL3h) mailto:sage [2017/03/18(土) 14:10:17.22 ID:JpaAP8SC0.net]
今時bind使わずlambdaで済ますよね

702 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 14:10:36.75 ID:TmvAgLdoM.net]
>>683
aをキャプチャする必要が有るだろうが
まじでclassとインスタンスの違いをもう少し学んでくれ

703 名前:デフォルトの名無しさん (オッペケ Sr97-w0Gz) mailto:sage [2017/03/18(土) 14:11:31.23 ID:2lr6MuOgr.net]
なんだ、継承の意味を知らないんじゃなくて
std::bindを見てECMAScriptのbindingと同じものだと勘違いしていただけか。
これでは話が噛み合うはずがない

704 名前:デフォルトの名無しさん (ワッチョイ 537b-gO1F) [2017/03/18(土) 14:14:40.36 ID:ux+WuUO90.net]
>>687
新しい文法追加してa->
*func って書いたらaを参照キャプチャしてfuncを呼び出す関数オブジェクトを返すようにしてほしいらしいよ。

705 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 14:17:30.12 ID:TmvAgLdoM.net]
>>689
関数を一級オブジェクトにしろという主張??
別の言語でやれとしかいいようがないな…

706 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 14:20:22.86 ID:waR+gchT0.net]
>>681-682
> インスタンス構築
それはインスタンス構築ではなく、使う物だけとりあえず入れてるんだよ。
a を構築しているのではなく、 a.func の数式 k*x+a を使いたいから、
とりあえず a と k に値を入れて使っているだけ。
数式を間借りしているだけなんだ。

もっと a が複雑で、100個くらいメンバを持っているベクトル値だったとして、
calcも calc_0 〜 'calc_100 とかあったとして、そのうち1個だけ丁度いい数式があったら、それを借りる感じ。
このデタラメっぷりはC++にいると理解不能だが、JavaScriptに慣れるとC++が色々面倒で仕方ない。
そもそもテンプレートも型消去も最初からvarだとやらなくていいんだよ。
(その分デバッグが辛いが)

707 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 14:24:47.73 ID:waR+gchT0.net]
>>689
いやその文法はすでにC++0xにあるとの理解だが、これが間違いか?
既に>>663にURL上げたが。
> メンバーを指すポインター演算子 .* および ->* は、特定のクラス・オブジェクトのメンバーを指すポインターをバインドする際に用いられます。

708 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 14:26:29.15 ID:TmvAgLdoM.net]
>>691
> それはインスタンス構築ではなく、使う物だけとりあえず入れてるんだよ。
>とりあえず a と k に値を入れて使っているだけ。
>数式を間借りしているだけなんだ。
それをインスタンス構築っていうんだよ、覚えとけばか

>もっと a が複雑で、100個くらいメンバを持っているベクトル値だったとして、
>calcも calc_0 〜 'calc_100 とかあったとして、そのうち1個だけ丁度いい数式があったら、それを借りる感じ。
そういう場合はお前の言うとりあえずだけを入れられるコンストラクタ作るんだよ
まぁ普通の感性ならその部分はサブクラスとして切り出すけどね

>このデタラメっぷりはC++にいると理解不能だが、JavaScriptに慣れるとC++が色々面倒で仕方ない。
>そもそもテンプレートも型消去も最初からvarだとやらなくていいんだよ。
面倒ならjsで書いとけばいいんじゃないですかね



709 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 14:27:43.20 ID:TmvAgLdoM.net]
>>692
間違い

710 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 14:43:08.69 ID:waR+gchT0.net]
>>684
ちなみに何でそれ書けないんだ?

std::function<...> f_bound = a.func; // (E) バインド済み
std::function<...> f_not_bound = A::func; // (F) 未バインド、第1引数はthis

で文法的に問題ないし、普通にこうだと思っていた。

ただし俺はC++でメンバポインタを使ったことはないから、
現在駄目なのなら何か理由があるのだろうけど、
逆にそうだと信じ切っており、
JavaScriptはこれができない=常にbindが必要なのでウザくて仕方なかった。例えば、

var func = someInstance.someMethod.bind(someInstance);

と常に2回 someInstance と書く必要があり、これがウザイ。
ただC++も同じく糞なのか?

711 名前:デフォルトの名無しさん (ワンミングク MM5f-W3uL) mailto:sage [2017/03/18(土) 14:55:00.20 ID:TmvAgLdoM.net]
>>695
classとインスタンスの違いがわかってないうちはマジで理解できないだろうからもう諦めろ

JavaScriptのbind一通り調べたよ
jsは関数型に依っててインスタンスって考え方がないんだな

712 名前:デフォルトの名無しさん (ワッチョイ a30e-BL3h) mailto:sage [2017/03/18(土) 15:03:41.03 ID:JpaAP8SC0.net]
最悪一部menberの参照だけ取られる表記と同じで、それがメンバ関数だとインスタンス全部が人質になるとか怖すぎ。

713 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 15:44:12.23 ID:waR+gchT0.net]
>>696
インスタンスとクラスの違いが分かってないのはお前だろ。
>>695をJavaScriptで再記すると、

var a = new A();
var func_0 = a.func; // bindされない ← 直感的にはbind済みであって欲しい
var func_1 = A.prototype.func; // bindされない ← これはOK

で、JavaScriptは両方ともbindされないんだよ。
だから他言語から来た連中はbindを忘れてここでバグると言われている。
その「他言語」ってのは俺はてっきりC++だと思っていたから、695の理解になる。

ところがC++も同様に糞ならまあそれでよし。
改めて見ると、代入出来ないってことか?つまり、以下が出来ない。

std::function<...> f = a->*func; // bind済み
std::function<...> f = a.*func; // bind済み

なるほどC++も糞だな。ただ、実装自体は>>669で出来るのだから、
何故これを出来ないようにしたのかは謎だが。

714 名前:デフォルトの名無しさん (ワッチョイ 838b-UnlH) mailto:sage [2017/03/18(土) 15:49:31.59 ID:YXP7lJmh0.net]
JavaScript…
あれはインスタンスしかないみたいな似非^2オブジェクト指向じゃん?
あまりの酷さに批判が高まったのか、エッセンス6とかでprototypeキーワードが導入されたが
それぐらいのもん

ちなC++の話として、クロージャはあんま継承関係無い
f.calc(x, 2)をfunc(x)の如く扱いたければfの所有でおk

715 名前:デフォルトの名無しさん (ワッチョイ 838b-UnlH) mailto:sage [2017/03/18(土) 15:55:28.34 ID:YXP7lJmh0.net]
個人的にはstd::bind(&F::calc, f, _1, 2)ですらF::calcの直接callに最適化されずに、
間接メモリアドレッシング後のcall止まりになるんではないかと危惧してゐる
テンプレートを使える環境にありながら
関数へのポインタなど使うのは教育上によろしくない

716 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 16:02:10.31 ID:waR+gchT0.net]
なおC#ではあっさり書けることが判明した。
> class DelegateTest
> {
> static void Main()
> {
> Person p1 = new Person("鬼丸美輝");
> Person p2 = new Person("神無月めぐみ");
>
> ShowMessage show = new ShowMessage(p1.ShowName);
> show += new ShowMessage(p2.ShowName);
> show += new ShowMessage(A);
> show += new ShowMessage(B);
>
> show();
> }
>
> // 結果
> // 名前: 鬼丸美輝
> // 名前: 神無月めぐみ
> // A が呼ばれました。
> // B が呼ばれました。
> ufcpp.net/study/csharp/sp_delegate.html

717 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 16:02:29.43 ID:waR+gchT0.net]
そしてC++でも出来そうなんだが、、、
> Human alice;
> printf("Alice");
> (alice.*pf5)();
>
> // おまけ
> int Human::*x = &Human::age;
> alice.age++;
> printf("age = %d (%d)", alice.*x, &(alice.*x));
> qiita.com/Ted-HM/items/282785fcdcd06fb59642

718 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 16:27:36.88 ID:waR+gchT0.net]
>>699
> 似非^2オブジェクト指向じゃん?
あれはクラスベースではなくプロトタイプベースだから。
それを無理矢理クラスベースとして使おうとするからおかしな事になる。
最初からプロトタイプベースとして使えば何も問題なく、
実際に表現出来る範囲もクラスベースよりも広いので、なかなか面白い。

> ちなC++の話として、クロージャはあんま継承関係無い
JavaScriptでも継承とクロージャは全く関係ない。

> f.calc(x, 2)をfunc(x)の如く扱いたければfの所有でおk
これはそうだと思う。
fがf_boundに変わっても手間は同じで、意味ねーというのが最初の主張。

>>700
> 個人的にはstd::bind(&F::calc, f, _1, 2)ですらF::calcの直接callに最適化されずに、
というかこれを期待するのがC++なのか?
それはさすがに厳しいとは思うが、確かに無理ではないが。

> テンプレートを使える環境にありながら
> 関数へのポインタなど使うのは教育上によろしくない
これはどういう意味?さすがに今回の上記
> std::bind(&F::calc, f, _1, 2)
をテンプレートで常に直接callするようには出来ないだろ。
というかテンプレートと関数ポインタの使う範囲は被らないと思うが。(代替出来ない)



719 名前:デフォルトの名無しさん (ワッチョイ 838b-UnlH) mailto:sage [2017/03/18(土) 16:35:15.55 ID:YXP7lJmh0.net]
>> 個人的にはstd::bind(&F::calc, f, _1, 2)ですらF::calcの直接callに最適化されずに、
>というかこれを期待するのがC++なのか?
>それはさすがに厳しいとは思うが、確かに無理ではないが。
できる
F:calc()は仮想関数では無いし、
表記の例では&F:calc自体が(F::calc()と同じシグネチャを持つ別名の関数とかに)差し替えられはしないので
本質的には直接callとなるべきもの

720 名前:デフォルトの名無しさん (ワッチョイ f35b-tpgq) mailto:sage [2017/03/18(土) 16:38:53.29 ID:waR+gchT0.net]
ああ分かった。
>>702はこちらの解釈間違い、これは出来ているわけではないね。
.* と ->* はあくまでその場で呼んでいるだけであって、
bind済みの関数を返してくれるわけではないのね。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<322KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef