[英]C++11 Template function to “implicity” convert bitset<N> to “unsigned long”
我可以创建一个C ++ 11模板函数来将位集显式转换为无符号长型:
template<size_t N>
unsigned long U(bitset<N> x) {
return x.to_ulong();
}
// Explicit conversion
unsigned long y = U(bitset<4>("1010"));
有没有一种方法可以使用C ++ 11模板辅助函数将位集“隐式”转换为无符号长整数。 例如,如果我将一个位集分配给一个无符号的long,那么我希望它自动将位集转换为正确的类型:
// What Template Function in C++11?
// Implicit Conversion
unsigned long z = bitset<4>("1010");
(如果无法使用C ++ 11模板函数创建隐式转换规则以将其转换为“ unsigned long”,那么也可以从具有强制转换为unsigned long的位集中派生一个新类。这是否可行? )
要将A
隐式转换为B
:
B
必须具有采用A
的非显式构造函数,或者 A
必须具有非显式的转换operator B()
。 这两个必须仅是成员函数。
由于您无法修改std::bitset
或unsigned long
,答案是:否,您不能将std::bitset
隐式转换为unsigned long
。 仅明确 。
您可以将std::bitset
包装在您自己的隐式可转换类中:
template<size_t N>
class MyBitset
{
public:
// constructors elided here
operator unsigned long()
{
return _bitset.to_ulong();
}
operator std::bitset<N>()
{
return _bitset; // Note that you get a copy here.
}
private:
std::bitset<N> _bitset;
};
如果您试图从namespace std
非多态类(即那些没有虚拟析构函数的类)派生,则您不是在编写惯用的C ++ ,请不要这样做。 以上是否真的可以解决您的问题,我们无法确定。 如果您需要的只是位串中的unsigned long
常量,则可以跳过类包装器,并直接用模板化函数替换其构造函数:
template<size_t N, class CharT>
unsigned long toUlong(const CharT* str,
typename std::basic_string<CharT>::size_type n =
std::basic_string<CharT>::npos,
CharT zero = CharT('0'),
CharT one = CharT('1'))
{
return std::bitset<N>(str, n, zero, one).to_ulong();
}
基于Maxim项目符号2的另一种解决方案:
template<size_t N>
class bits : public bitset<N> {
public:
bits(unsigned long num) : bitset<N>(num) {}
bits(char* binstr) : bitset<N>(binstr){}
operator unsigned long() {
return this->to_ulong();
}
// Slice Bit Range
unsigned long slice(unsigned L, unsigned R)
{
unsigned long P1;
unsigned long P2;
if (L>R) {
P2 = L;
P1 = R;
}
else {
P2 = R;
P1 = L;
}
unsigned long x = this->to_ulong();
unsigned long W = P2 - P1 + 1;
unsigned long Value = (x >> P1) & ((1<<W) - 1);
return Value;
}
// Return Hex String
string hstr() {
stringstream xx;
xx << "0x" << hex << this->to_ulong();
return xx.str();
}
};
int main(int argc, char** argv) {
// Implicit conversion...
unsigned long xxx = bits<4>("0101");
unsigned long yyy = bits<4>(xxx).slice(1, 2);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.