boost库是否提供了安全bool习语的实现,以便我可以从中派生我的类?
如果是的话 - 它在哪里?
如果不是 - 除了自己实施之外我还有什么其他选择?
我发现了以下类似的问题:“Is there a safe bool idiom helper in boost?”并且接受的答案建议在Boost.Operators中使用bool_testable<>
。
不幸的是,当我检查boost manual时,我找不到它。使用它的代码也无法编译。
我还偶然发现了另一个问题“Was boost::bool_testable<> relocated or removed?”,而那里的评论表明bool_testable
实际上从来没有对任何发布版本提升。
主题上还有一个有趣的article by Bjorn Karlsson,其中包含可以复制粘贴到我的项目中的代码。但是,我希望有一个普遍接受和维护的实用程序库(例如boost)已经实现了它。
出于兼容性原因,我不想依赖C ++ 11。
答案 0 :(得分:15)
我不知道一个普遍接受的实用程序库提供了安全布尔的习语。在Boost中有一些尝试,它们经常导致关于如何提供安全bool实现(命名约定,宏,内联包含,继承)的争论。因此,Boost中至少存在三个实现,只有一个实现Boost.Spirit.Classic's safe_bool,专为外部使用而设计。
每项实施的细节和概念:
operator boost::range_detail::safe_bool< MemberPtr >::unspecified_bool_type() const
函数的safe_bool::to_unspecified_bool()
成员函数。boost/detail/workaround.hpp
之前需要加smart_ptr/detail/operator.hpp
。this_type
类型。T
类型。T* px
成员变量。boost::spirit::class::safe_bool
而不强制派生类的多重继承。boost::spirit::classic::safe_bool< Derived >
。如果Derived
已经从Base
继承,则使用boost::spirit::classic::safe_bool< Derived, Base >
。bool operator_bool() const
成员函数。此示例使用Boost 1.50。如果传递给构造函数的整数大于0,则每个类应在布尔上下文中求值为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 ): 0 range_bool( 1 ): 1 smart_ptr_bool( -1 ): 0 smart_ptr_bool( 1 ): 1 spirit_bool( -1 ): 0 spirit_bool( 1 ): 1
我不知道有任何其他选择。当我遇到安全bool习语时,大多数实现都是Bjorn Karlsson's article中提供的实现的复制和粘贴变体。
答案 1 :(得分:0)
从Boost 1.55开始,Boost.Core中包含<boost/core/explicit_operator_bool.hpp>
标头。它要求您定义bool operator!()
并使用BOOST_EXPLICIT_OPERATOR_BOOL()
宏(还有BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()
和BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()
的变体。)
template< typename T >
class my_ptr
{
T* m_p;
public:
BOOST_EXPLICIT_OPERATOR_BOOL()
bool operator!() const
{
return !m_p;
}
};