首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将非成员转换重载为布尔运算符

将非成员转换重载为布尔运算符
EN

Stack Overflow用户
提问于 2012-03-29 02:49:33
回答 4查看 2.2K关注 0票数 7

我正在尝试为std::bitset编写布尔转换运算符

我试过了:

代码语言:javascript
运行
复制
template<size_t size>
operator bool(std::bitset<size> & b)
{
    return b.any();
}

但我有

代码语言:javascript
运行
复制
error C2801: 'mynamespace::operator bool' must be a non-static member

从我的视觉工作室。

但是当我查找C2801 explanation时,它没有提到转换操作符(只提到=,->,[],())

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

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

代码语言:javascript
运行
复制
typedef std::bitset<x> Bitset;
//typedef unsigned Bitset;

所以理想的语法应该是这样的:

代码语言:javascript
运行
复制
Bitset b = whatewer;
if(b)
    doStuff();

)

如果这种重载是不可能的,那么推荐的解决方法是什么?

到目前为止,我使用它的方式如下:

代码语言:javascript
运行
复制
if(b == Bitset(0))
    doStuff(); 

但是我不喜欢这样。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-29 02:59:01

正如错误消息所述,转换运算符必须是类的非静态成员。这是事实。

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

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

代码语言:javascript
运行
复制
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();
}

然后使用它作为:

代码语言:javascript
运行
复制
if (to_bool(whatever)) 
{
}

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

票数 6
EN

Stack Overflow用户

发布于 2012-03-29 02:59:16

§12.3.2/1:“类X的成员函数的名称为...指定从X到指定类型的转换...”(C++11使用相同的节号和几乎相同的措辞,只是增加了函数没有参数)。

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

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

要做您想做的事情,一种方法是在std::bitset周围编写一个包装器,提供您所关心的转换:

代码语言:javascript
运行
复制
template <int size>
class mybitest {
    std::bitset<size> bits;
public:
    operator bool() { return bits.any(); }
}

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

票数 6
EN

Stack Overflow用户

发布于 2012-03-29 02:59:24

该标准对此(12.3.2)有点不清楚:

X类的成员函数,没有名称为...形式的参数指定从X到conversion- type -id指定的类型的转换。这样的函数称为转换函数。不能指定返回类型。如果转换函数是成员函数类型,则转换函数(8.3.5)的类型为“不带参数的函数返回--id”。

第一句话似乎暗示只有成员函数才能是转换函数,但我不确定条件“如果转换函数是成员函数”的目的是什么。

我将第一句话作为绑定,并得出转换函数必须是成员函数的结论。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9913834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档