Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Operator に struct 制約を使用するべきか #59

Closed
key-moon opened this issue Sep 17, 2020 · 4 comments
Closed

Operator に struct 制約を使用するべきか #59

key-moon opened this issue Sep 17, 2020 · 4 comments

Comments

@key-moon
Copy link
Contributor

現状、Operator関係は

public class MFGraph<TValue, TOp>
    where TValue : struct
    where TOp : struct, INumOperator<TValue>

と、struct 制約が TOp についています。しかし、これは高速化のための制約なためなくても問題ありません。高速化のためのものをコードで強制するのに少し違和感があるので、TOpstruct 制約はないべきなのではないかと思います。

@terry-u16
Copy link
Contributor

それは私も思いました。実用面でも例えば(するかどうかはさておき)継承ができない等のデメリットが生まれてしまいそうです。

@kzrnm
Copy link
Owner

kzrnm commented Sep 17, 2020

賛成です。削除で良いと思います。

@takytank
Copy link
Contributor

takytank commented Sep 18, 2020

反対ではないのですが、単純に削除だと問題があります。
MaxFlow や Segtree 等において Operator を使用している部分は

 static readonly TOp op = default;

のようになっています。そのため、TOpに参照型が渡された場合、null参照になって死にます。
struct 制約を削除するのであれば、代わりに new() 制約を追加して、TOp のインスタンス作成部分を

static readonly TOp op = new TOp();

と変更する作業を同時に行う必要があります。

あとは、元々あんまり使用する気も無かったですが、
#33 (comment)
の一部案にある

public TCap Multiply(TCap x, TCap y) => default(TCapOp).Multiply(x, y);

みたいな書き方は完全に避けた方がよくなりそうですね。

kzrnm added a commit that referenced this issue Feb 27, 2022
@kzrnm
Copy link
Owner

kzrnm commented Feb 27, 2022

default が使えなくて困るので struct 制限はつけたままにしておきます。

@kzrnm kzrnm closed this as completed Feb 27, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants