我可以创建一个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模板辅助函数将位集“隐式”转换为无符号的长整型。例如,如果我将一个位集赋值给一个无符号的长整型,那么我希望它自动将该位集转换为正确的类型:
// What Template Function in C++11?
// Implicit Conversion
unsigned long z = bitset<4>("1010");(如果不能创建一个隐式转换规则来将其转换为“使用C++11模板函数的无符号长整型”,也可以从具有强制转换函数的位集派生一个新的类,这也是可能的吗?)
发布于 2018-06-20 23:54:38
要将A隐式转换为B,请执行以下任一操作:
B必须具有采用operator B().的非显式构造函数,而or
A必须具有采用非显式转换A的构造函数这两个函数只能是成员函数。
因为您不能修改std::bitset或unsigned long,所以答案是:不,您不能隐式地将std::bitset转换为unsigned long。只是明确地说。
发布于 2018-06-21 00:19:44
您可以将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中的非多态类派生(即那些没有虚拟析构函数的类),你是not writing idiomatic 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();
}发布于 2018-06-21 00:27:48
另一种基于Maxim的Bullet 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);
}https://stackoverflow.com/questions/50952307
复制相似问题