当前位置:  开发笔记 > 编程语言 > 正文

C++安全bool包装器

如何解决《C++安全bool包装器》经验,为你挑选了4个好方法。

我正在尝试设计一个应用安全bool习语bool包装器结构. 解决这个问题的经典实现非常简单:骨架可能是这样的:

struct Bool final
{
  Bool() = default;

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

  explicit operator bool() const {
    return _value;
  }

private:
  bool _value{false};
};

我试图改进的部分是如何Bool构建的.
例如,我想通过设计避免隐式缩小:

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

我试图用模板伤害自己,但没有成功.

我怎么能让它工作?



1> François And..:

您可以通过显式删除所有其他构造函数来实现此目的.

struct Bool final
{
    template
    Bool(T) = delete;

    Bool(bool value);
};


@gurka请参见[default constructor](http://en.cppreference.com/w/cpp/language/default_constructor)."如果没有为类类型[...]提供任何类型的用户声明构造函数,编译器将始终将默认构造函数声明为其类的内联公共成员." 简单地提供`Bool(bool值)`足以删除默认构造函数.
该代码还将删除默认构造函数(隐式),对吧?

2> yuri kiloche..:

添加并显式删除模板构造函数:

template 
Bool(T) = delete;

bool比其他构造函数更好地匹配除了实际之外的任何东西,因此将阻止隐式转换.


"除了实际的`bool`之外的任何东西" - 和"Bool":这不会,也可能不会,禁用编译器生成的副本和移动构造函数.

3> pilkch..:

如果你只需要:
一个只有"true"或"false"的变量,并且不能隐式转换为int/char/pointer,那么我会看一下使用枚举类:

enum class Bool {
    False,
    True,
};



4> Barry..:

我正在尝试设计一个应用安全bool习语的bool包装器结构.

别.

安全bool成语仅在C++ 03及更早版本中有用 - 如果你通过做类似的事情来表达你的类型是"truthy"的话:

struct A {
    operator bool() const;
};

你会遇到各种各样的问题,比如:

A{} + 4;    // ok?!
A{} < 0;    // ok?!
A{} == B{}; // ok if B also has operator bool??!

所以安全的bool成语是使用函数指针(当然,函数指针!)解决这个意外的隐式转换问题.

在C++ 11中,我们有更好的解决方案:

struct A {
    explicit operator bool() const;
};

正是我们想要的.实际上,它实际上是为解决这个问题而设计的.虽然安全的bool成语是相当复杂的脚手架,但explicit operator bool使用起来非常简单,只做正确的事情.你不需要一个包装器 - 使用你的包装器比explicit operator bool直接写它更难.

此外,你的包装器对用户施加了(a)不可导出性,因为你做了Bool最终的和(b)一个额外的bool成员,你必须保持同步,所以它引入而不是解决问题.考虑一下您需要做多少工作:

template 
struct my_unique_ptr : Bool { ... };

VS

template 
struct my_unique_ptr {
    T* ptr;

    explicit operator bool() const { return ptr; }
};

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有