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

Add operator bool to modint #169

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open

Add operator bool to modint #169

wants to merge 2 commits into from

Conversation

szdytom
Copy link

@szdytom szdytom commented Aug 14, 2023

It can be useful if you want something like:

mint x;
// ...
if (x)
  do_sth(x);

@mizar
Copy link

mizar commented Aug 16, 2023

95a6273
Strange to convert zero value to true.

For conversion rules between bool and int types in the C++ language,

https://timsong-cpp.github.io/cppwp/n4659/conv.prom#6

A prvalue of type bool can be converted to a prvalue of type int, with false becoming zero and true becoming one.

https://timsong-cpp.github.io/cppwp/n4659/conv.bool#1

A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true. For direct-initialization, a prvalue of type std​::​nullptr_­t can be converted to a prvalue of type bool; the resulting value is false.

Copy link

@yaito3014 yaito3014 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is preferred to make conversion function explicit unless any reason not to do so.

atcoder/modint.hpp Show resolved Hide resolved
atcoder/modint.hpp Show resolved Hide resolved
@szdytom
Copy link
Author

szdytom commented Sep 8, 2024

it is preferred to make conversion function explicit unless any reason not to do so.

This is the place where we need implicit conversion. no one wants to write if ((bool)x) { ... } anyway.

@yaito3014
Copy link

it is preferred to make conversion function explicit unless any reason not to do so.

This is the place where we need implicit conversion. no one wants to write if ((bool)x) { ... } anyway.

You can write if (x) { ... } even if the conversion operator to bool is marked as explicit.

cf. https://en.cppreference.com/w/cpp/language/implicit_conversion#Contextual_conversions

@TumoiYorozu
Copy link
Contributor

TumoiYorozu commented Sep 8, 2024

This repository does not accept requests for new features.

For now, we are not planning to add new features

In this case, I don't think it's necessary because you can add a custom bool cast as shown below:

#include <atcoder/modint>
#include <bits/stdc++.h>


struct mint : public modint998244353 {
    using static_modint::static_modint;
    mint(modint998244353  m) : modint998244353 (m) {}
    operator bool() const { return val() != 0; }
};


int main() {
    mint m(123);

    if (m) {
        puts("not zero");
    } else {
        puts("zero");
    }
}

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

Successfully merging this pull request may close these issues.

4 participants