首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11模板函数“隐含”将bitset<N>转换为"unsigned long“

C++11模板函数“隐含”将bitset<N>转换为"unsigned long“
EN

Stack Overflow用户
提问于 2018-06-20 23:49:31
回答 3查看 86关注 0票数 1

我可以创建一个C++11模板函数来显式地将一个位集转换为一个无符号的长整型:

代码语言:javascript
复制
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模板辅助函数将位集“隐式”转换为无符号的长整型。例如,如果我将一个位集赋值给一个无符号的长整型,那么我希望它自动将该位集转换为正确的类型:

代码语言:javascript
复制
// What Template Function in C++11?

// Implicit Conversion
unsigned long z = bitset<4>("1010");

(如果不能创建一个隐式转换规则来将其转换为“使用C++11模板函数的无符号长整型”,也可以从具有强制转换函数的位集派生一个新的类,这也是可能的吗?)

EN

回答 3

Stack Overflow用户

发布于 2018-06-20 23:54:38

要将A隐式转换为B,请执行以下任一操作:

  • B必须具有采用operator B().

的非显式构造函数,而or

  • A必须具有采用非显式转换A的构造函数

这两个函数只能是成员函数。

因为您不能修改std::bitsetunsigned long,所以答案是:不,您不能隐式地将std::bitset转换为unsigned long。只是明确地说。

票数 7
EN

Stack Overflow用户

发布于 2018-06-21 00:19:44

您可以将std::bitset包装在您自己的隐式可转换类中:

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

Demo

如果你试图从namespace std中的非多态类派生(即那些没有虚拟析构函数的类),你是not writing idiomatic C++,不要这样做。以上是否真的是你的问题的解决方案,我们还不知道。如果你所需要的只是位串中的unsigned long常量,你可以跳过类包装器,直接用模板化函数替换它的构造函数:

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

Demo

票数 2
EN

Stack Overflow用户

发布于 2018-06-21 00:27:48

另一种基于Maxim的Bullet 2的解决方案:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50952307

复制
相关文章

相似问题

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