我正在尝试为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();
但我不喜欢它。
谢谢
答案 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)
{
}
仍然不理想,但我认为更接近