[過去ログ] C++相談室 part154 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
813
(2): ◆QZaw55cn4c 2021/02/21(日)19:01 ID:3Ebck9FU(1/4) AAS
>>807
この質問に対して回答をつける用意がありますが、しばしお待ちを
814
(3): ◆QZaw55cn4c 2021/02/21(日)19:27 ID:3Ebck9FU(2/4) AAS
>>807,813
昔のコードを今読んでみたんですが、実のところ関数オブジェクトにする必要性があったかどうか、今の価値観のもとでは首をかしげています
数値計算のプログラムって、無自覚にバンバン書いてると例えばルンゲ食ったをやっているとこと他とかが混ざり合って収拾がつかなくなる、と思って関数オブジェクトにアイソレートした記憶があって、それを思い出して読んでみたんですけれども、今読んでみても、なんだか、ねえ‥‥
2chスレ:tech
815
(1): 2021/02/21(日)20:07 ID:F92hI73d(3/6) AAS
>>809
Fooはこんなやつ、
外部リンク:ideone.com

IFooは、C++ではよく考えたらIFooのオブジェクトを直接生成できないので(>>802の仰せの通り
std::shared_ptr<IFoo>とかで生成することを考えたのだがエラーになるorz
(上のリンク先のコードでコメントアウトしてあるgenerate_IFoo()
思いのほか闇が深かった\(^o^)/

std::shared_ptr<IFoo>が生成できた暁には、
std::shared_ptr<IFoo> pがリソースの所有権を握ったFooを保持しているとき、
std::shared_ptr<IFoo> qというのがいるとして、
省4
816: 2021/02/21(日)20:09 ID:F92hI73d(4/6) AAS
ちなみにWandboxでソースコードをフォークする方法は
初心者なので
わかり
ません
817
(1): 2021/02/21(日)20:14 ID:LxNhpnKU(1/2) AAS
generate_Foo()がコケてるのはnewのところでFooのコピコンがないだけだろ
コピコン書くか、ムーコン使いたいならnew Foo(std::move(foo3))にすればいいだけ

後半も意味不明
*q = *pってそれスライシングだぞ
818
(1): 2021/02/21(日)20:23 ID:F92hI73d(5/6) AAS
>>817
普通の(ムーブでない)コピコンは書けないなぜなら>>806の理由により

>*q = *pってそれスライシングだぞ
どゆこと?
Foo foo1とFoo foo2だと
foo1 = foo2
とできるのに、
819: 2021/02/21(日)20:26 ID:F92hI73d(6/6) AAS
ちょっと補足すると、IFooには現状代入手段が無いから、
*q = *pはそもそもコンパイルが通ることはなく、目的とする機能を形而上的に表す仮想コード
のつもり
820
(3): 2021/02/21(日)21:03 ID:+My/Unlg(1) AAS
>>814
処理を意味でまとめるようなことなら積極的にやるべきだと思いますが、それは関数オブジェクトじゃなくて関数でもできますよね?
821: 2021/02/21(日)21:05 ID:HYHVDYIS(4/4) AAS
>>815
コピー代入演算子とムーブコンストラクタだけ定義するとか意味分からんし
インターフェースによる隠蔽より先にそっち解決しなさい
何がしたいのか自分で本当にわかってる?
822
(2): ◆QZaw55cn4c 2021/02/21(日)21:07 ID:3Ebck9FU(3/4) AAS
>>820
まあ、そのとおりであり、そうなんですよね…
>>814 は関数オブジェクトである必然性はありません、関数オブジェクトを積極的に使う例としては STL にご登場願うしかないのかもしれませんね
823
(1): 2021/02/21(日)22:29 ID:LxNhpnKU(2/2) AAS
>>818
shared_ptrは関係ないから普通のポインタで話するぞ(同じ事だ)
IFoo* p = new Foo();
IFoo* q = new Foo();
というのがあったとして*q = *p;ってのは何だと思う?
pとqはIFoo*型だ
だからもちろん*pと*qというのはIFoo型だ
すなわち*q = *p;というのはIFoo::operator=(const Foo&)の呼び出しだ
operator=()はvirtualにできないから、pとqが本当はFoo型オブジェクトを指してることなんか知りもしないし考慮もしない
よってIFoo部分の代入だけが行われて、要はqのIFoo部分だけが首チョンパされてpのIFoo部分が代入される
省1
824
(1): はちみつ餃子 ◆8X2XSCHEME 2021/02/21(日)23:00 ID:jd0qgVVy(2/2) AAS
>>822
関数オブジェクトに「関数」とついているのは関数と同じ記法で呼び出せるということに意味があって、インターフェイスの問題。
状態を持った関数 (関数オブジェクト) も状態を持たない関数 (関数ポインタ) も統一的に扱えたらうれしいねって話なので、
状態を持たず、高階関数に渡すこともない場合は関数オブジェクトにする意味はないな。
(普通の関数も static 変数への参照を持ってたりする場合もあるので必ずしも状態を持たないわけではないけど。)
825: ◆QZaw55cn4c 2021/02/21(日)23:42 ID:3Ebck9FU(4/4) AAS
>>824,820(>>813,814,822)
結局、どーでもいい一発芸で、ああ動くね‥‥、と思ったまま放置してましたね<関数オブジェクト
2chスレ:tech
外部リンク:ideone.com
あとはラムダ式の理解のための存在という認識、か
826: はちみつ餃子 ◆8X2XSCHEME 2021/02/22(月)00:10 ID:oiAqsUn6(1) AAS
「ラムダ式が関数オブジェクト (型の定義と生成) の構文糖」というのは
既存のプログラムとの整合性を壊さない上手いアイデアだと思うけど、
しばらくしたら「関数オブジェクトはラムダ式の実体」という説明のほうが
通りがよくなったりするかもしれないね。
827
(1): 2021/02/22(月)04:39 ID:7qATnC1I(1/2) AAS
関数オブジェクトで状態を渡せるのは結構なんだが、コピーコンストラクタ渡しなので、
手の込んだ状態管理だった場合は結局、C言語と同じくユーザー定義変数を介して状態を読み書きすることになる。
828: 2021/02/22(月)08:23 ID:Dz0hZ3aS(1) AAS
>>827
shared_ptr使えば、大抵の場合は問題ないんじゃない?
829
(3): 2021/02/22(月)09:54 ID:Y0MZ31oO(1) AAS
>>807,820ですけどQZで始まる人あまりにもレベル低いというか回答者として不適格だと思うのでNGします
830: 2021/02/22(月)10:22 ID:1euWwsnd(1) AAS
>>829
答えてもらってる立場で偉そうに。常識ないの?
831
(2): 2021/02/22(月)11:11 ID:M+ptXBNl(1/3) AAS
いやでも実際・・・QZはね・・・
50過ぎのおっさんが無理して絡みにいってるけど空回りしてる感じなんだよね
ほんと残念だけども
832: 2021/02/22(月)11:36 ID:7qATnC1I(2/2) AAS
関数オブジェクトに対するラムダ式の優位性は、ローカル変数を比較的安全かつ手軽に参照渡しできることだろう。
1-
あと 170 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.355s*