将非成员转换重载为bool运算符

时间:2012-03-28 18:49:33

标签: c++ operator-overloading

我正在尝试为std :: bitset

编写bool转换运算符

我试过了:

template<size_t size>
operator bool(std::bitset<size> & b)
{
    return b.any();
}

但我得到了

error C2801: 'mynamespace::operator bool' must be a non-static member

来自我的视觉工作室。

但是当我查找C2801 explanation时,它没有提及转换运算符(仅约=, - &gt;,[],())

那么,是否有可能以某种方式编写“将std :: bitset转换为bool运算符?”

(我不能在我的if语句中调用b.any(),因为当std :: bitset被unsigned或者某些东西替换时,必须运行相同的代码

typedef std::bitset<x> Bitset;
//typedef unsigned Bitset;

所以理想的语法就像:

Bitset b = whatewer;
if(b)
    doStuff();

如果无法进行此重载,建议的解决方法是什么?

到目前为止,我使用它:

if(b == Bitset(0))
    doStuff(); 

但我不喜欢它。

谢谢

4 个答案:

答案 0 :(得分:6)

正如错误消息所示,转换运算符必须是类的非静态成员。那是真的。

  

我不能在我的if语句中调用b.any(),因为当std :: bitset被unsigned或其他东西替换时,必须运行相同的代码。

如果那是你的问题,那么你可以使用函数重载,并调用它传递将返回一个布尔值的参数:

template<typename T>
bool to_bool(T const & b)
{
    return b; //implicit conversion (if allowed) for all other types
}

template<size_t N>
bool to_bool(std::bitset<N> const & b)
{
    return b.any();
}

然后将其用作:

if (to_bool(whatever)) 
{
}

它将调用正确的过载。如果whatever的类型为std::bitset<N>,则将调用第二个重载函数,否则将调用第一个函数。

答案 1 :(得分:5)

§12.3.2/ 1:“类X的成员函数,其名称为[...],指定从X到指定类型的转换......”( C ++ 11使用相同的节号和几乎相同的措辞,只添加该函数不带参数)。

定义转换的另一种可能方法是构造函数(第12.3.1节),它显然也是一个类成员。

简而言之,是的,转换必须始终定义为成员函数。

实现所需目标的一种方法是在std::bitset周围编写一个包装器,提供您关注的转换:

template <int size>
class mybitest {
    std::bitset<size> bits;
public:
    operator bool() { return bits.any(); }
}

但是如果你决定这样做,你需要为你正在使用的bitset基本上所有的部分(ctors,赋值等)编写转发函数。

答案 2 :(得分:2)

标准有点不清楚(12.3.2):

  

类X的成员函数没有带有表单名称的参数[...]指定从X转换为conversion-type-id指定的类型。这些功能称为转换功能。不能指定返回类型。 如果转换函数是成员函数,则转换函数的类型(8.3.5)是“不返回convert-type-id的参数的函数”。

第一句似乎暗示只有成员函数可以是转换函数,但我不确定条件“如果转换函数是成员函数”的目的是什么。< / p>

我将第一句作为约束并得出结论,转换函数必须是成员函数。

答案 3 :(得分:0)

如果这对某人有帮助,您实际上可以提供一个not运算符

template<size_t size>
operator !(std::bitset<size> & b)
{
    return !b.any();
}

并使用!!惯用法像这样使用它:

if (!!whatever)
{
}

仍然不理想,但我认为更接近