Search code examples
c++booleansafe-bool-idiom

C++ safe bool wrapper


I'm trying to design a bool wrapper struct applying the safe bool idiom.
The classic implementation to solve this is pretty trivial: the skeleton could be something like this:

struct Bool final
{
  Bool() = default;

  Bool(bool value)
    : _value{value}
  {}

  explicit operator bool() const {
    return _value;
  }

private:
  bool _value{false};
};

The part I'm trying to improve is how Bool is constructed.
For example I want to avoid implicit narrowing by design:

Bool b1(45); // yields warnings, but it compiles
Bool b2{3};  // not ok by standard

I tried to hurt myself using templates, but without success.

How could I make it work?


Solution

  • You can achieve this by explicitly deleting all other constructors.

    struct Bool final
    {
        template<class T>
        Bool(T) = delete;
    
        Bool(bool value);
    };