gpt4 book ai didi

c++ - boost中的安全 bool 成语?

转载 作者:IT老高 更新时间:2023-10-28 22:59:29 28 4
gpt4 key购买 nike

boost 库是否提供了安全 bool 习惯用法的实现,以便我可以从中派生我的类?

如果是 - 它在哪里?

如果不是 - 除了我自己实现之外,我还有哪些选择?


我发现了以下类似的问题:“Is there a safe bool idiom helper in boost?”并且接受的答案建议使用 bool_testable<>Boost.Operators .

不幸的是,当我查看 boost manual我在那里找不到。使用它的代码也无法编译。

我还偶然发现了另一个 SO 问题“Was boost::bool_testable<> relocated or removed?”,那里的评论表明 bool_testable实际上从未制作过任何版本的 boost。

还有一个有趣的article by Bjorn Karlsson关于包含可以复制粘贴到我的项目中的代码的主题。但是,我希望有一个普遍接受和维护的实用程序库(例如 boost)已经实现了。


出于兼容性原因,我不想依赖 C++11。

最佳答案

我不知道提供安全 bool 习语的普遍接受的实用程序库。在 Boost 中进行了一些尝试,它们经常导致关于如何提供安全 bool 实现(命名约定、宏、内联包含、继承)的争论。因此,Boost 中至少存在三个实现,其中只有一个实现,Boost.Spirit.Classic's safe_bool ,专供外用。


每个实现的细节和概念:

  • Boost.Range's safe_bool
    • 包含在 detail 目录中,因此未明确设计为供外部使用。
    • 使用模板助手类型和静态成员函数来实现。
    • 启用安全 bool 的类应:
      • 提供 operator boost::range_detail::safe_bool< MemberPtr >::unspecified_bool_type() const委托(delegate)给静态 safe_bool::to_unspecified_bool() 的成员函数功能。
  • Boost.SmartPtr's operator_bool :
    • 包含在 detail 目录中,因此未明确设计为供外部使用。
    • 头文件旨在直接包含在类定义中。见 shared_ptr.hpp举个例子。
    • 需要包括 boost/detail/workaround.hpp在包括 smart_ptr/detail/operator.hpp 之前.
    • 周围启用了安全 bool 的类预计会:
      • 提供this_type输入。
      • 提供T输入。
      • 提供T* px成员变量。
  • Boost.Spirit.Classic's safe_bool
    • 专为外部使用而设计。
    • 使用 CRTP模式。
    • 旨在支持基类链接,允许boost::spirit::class::safe_bool无需在派生类上强制多重继承即可使用。
    • 启用安全 bool 的类应:
      • 公开派生自 boost::spirit::classic::safe_bool< Derived > .如果 Derived已经继承自 Base ,然后使用 boost::spirit::classic::safe_bool< Derived, Base > .
      • 提供bool operator_bool() const成员函数。

此示例使用 Boost 1.50。如果传递给构造函数的整数大于 0,则每个类都应在 bool 上下文中计算为 true:

// Safe-bool idiom with Boost.Range.
#include <boost/range/detail/safe_bool.hpp>
class range_bool
{
public:
range_bool( int x ) : x_( x ) {}
private:
// None of these are required, but makes the implementation cleaner.
typedef boost::range_detail::safe_bool< int range_bool::* > safe_bool_t;
typedef safe_bool_t::unspecified_bool_type unspecified_bool_type;
int dummy;
public:
operator unspecified_bool_type() const
{
return safe_bool_t::to_unspecified_bool( x_ > 0, &range_bool::dummy );
}
private:
int x_;
};

// Safe-bool idiom with Boost.SmartPtr.
#include <boost/detail/workaround.hpp>
class smart_ptr_bool
{
public:
smart_ptr_bool( int x ) { px = ( x > 0 ) ? &dummy : 0 ; }
private:
typedef smart_ptr_bool this_type; // -.
typedef int T; // :- Required concepts when using
T* px; // -' smart_ptr's operator_bool.
private:
T dummy; // Simple helper.
public:
#include <boost/smart_ptr/detail/operator_bool.hpp>
};

// Safe-bool idiom with Boost.Spirit.
#include <boost/spirit/include/classic_safe_bool.hpp>
class spirit_bool: public boost::spirit::classic::safe_bool< spirit_bool >
{
public:
spirit_bool( int x ) : x_( x ) {}
public:
// bool operator_bool() is required by the spirit's safe_bool CRTP.
bool operator_bool() const { return x_ > 0; }
private:
int x_;
};

#include <iostream>

int main()
{
std::cout << "range_bool( -1 ): " << range_bool( -1 ) << std::endl
<< "range_bool( 1 ): " << range_bool( 1 ) << std::endl
<< "smart_ptr_bool( -1 ): " << smart_ptr_bool( -1 ) << std::endl
<< "smart_ptr_bool( 1 ): " << smart_ptr_bool( 1 ) << std::endl
<< "spirit_bool( -1 ): " << spirit_bool( -1 ) << std::endl
<< "spirit_bool( 1 ): " << spirit_bool( 1 ) << std::endl;
return 0;
}

结果输出:

range_bool( -1 ):     0range_bool(  1 ):     1smart_ptr_bool( -1 ): 0smart_ptr_bool(  1 ): 1spirit_bool( -1 ):    0spirit_bool(  1 ):    1

我不知道任何替代方案。当我遇到安全 bool 惯用语时,大多数实现都是Bjorn Karlsson's article 中提供的实现的复制粘贴变体。 .

关于c++ - boost中的安全 bool 成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11781584/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com