如何让“自动”转换类型

时间:2016-03-06 01:42:41

标签: c++ proxy auto

#include <bitset>
#include <iostream>
using namespace std;
int main() {
    bitset<8> c = 0;
    c[3]=1;
    auto s = c[5];
    s = !s;
    cout << c[5];
}

该程序将s视为一个类,其结果为c [5] = 1。看起来     汽车和放大器; s = c [5];

需要这样做(当然它会造成复杂性错误)。那怎么办?

有些人表示他们不太了解我,所以也许我应该重新描述这个问题: 对于代理,如果我使用“auto”来获取值,我希望得到property.get()的类型,但我得到属性的类型(代理本身)。 如果它在一个大型项目中并且s的类型更复杂,那么我使用“!! c [5]”或“bool s”并不是一个好主意。

4 个答案:

答案 0 :(得分:1)

这是一种方式。不漂亮,但这似乎有效:

auto s = !!c[5];

此外,你总是可以有一个明确的(int)演员,但你必须有理由不这样做......

答案 1 :(得分:1)

auto用于获取对象的实际类型。如果您想要其他类型(即不是代理参考),请不要使用auto

bool s = c[5];

答案 2 :(得分:0)

std::bitset::operator[]

返回rvalue,因此您无法引用它。您只能引用整个bitset。

答案 3 :(得分:0)

这是一个非常好的问题 - 尽管措辞可能更好。

如果我理解正确,您希望s应构建为bool并接收值false,而是将其构建为bitset::reference0,然后您可以否定,当然会更改原始bitset并导致cout << c[5]发出1

实际上是预期的结果。如果您阅读std::bitset::operator[]的文档,您将看到有两个重载:

bool operator[] (size_t pos) const;
reference operator[] (size_t pos);

以下评论:

  

如果bitset对象是const限定的,则该函数返回bool值。否则,它返回特殊成员类型引用的值,该值使用 reference-semantics 模拟一个bool值,相对于bitset中的一位(参见bitset::reference)。

所以基本上你想要第一个版本但是第二个版本。

为了实现您的目标,您必须执行以下任何操作:

  1. 声明显式类型bool,而不是使用auto,例如bool s = c[5];

  2. 使用显式强制转换为bool,或将隐式转换为bool的整数类型,例如auto s = static_cast<bool>(c[5]);

  3. bitset声明为const,例如const bitset<8> c = 16; auto s = c[5];

  4. 在访问该位之前将位集投射到const,例如auto s = static_cast<const bitset<8>>(c)[5];

  5. @ ly000是错误的,你不能引用bitset中的某个位,因为这正是你在这里得到的(这就是引用语义的意思) - 虽然他的意思可能是你不能在传统意义上有一个引用,但需要bitset::reference返回的operator[]对象提供的包装器。

    @Sam Varshavchik的解决方案之所以有效,是因为它强制bitset::reference返回的operator[]对象为bool,以便不执行“{0}”。操作 - 但我个人并不喜欢这样,因为它有点模糊了你的意图。在我看来,最好的选择是选项一,或者如果你不需要更改位集,选项三。

    顺便说一下,将bitset初始化为0是多余的,因为默认构造函数会将所有位初始化为零。