带转换的C++重载[]

use*_*005 7 c++ overloading

我有一个表示布尔值向量的C数据结构; 由于我无法控制的原因,bools'在内部存储为具有两个神奇值(不是0和1 ......)的整数,表示真和假.我创建了一个包装这个C结构的C++类,它运行得很好.我已经实现了set()get()方法:

void Class::set(size_t index , bool value) {
     if (value)
        c_ptr[index] = SPECIAL_TRUE_VALUE;
     else
        c_ptr[index] = SPECIAL_FALSE_VALUE;
}
Run Code Online (Sandbox Code Playgroud)

这没关系; 但理想情况下我想重载operator [],但是我不清楚如何/如果我能做到这一点 - 由于bool和整数值之间的特殊转换?

Yak*_*ont 7

struct pseudo_reference {
  operator bool()const&&{
    return c->get(index);
  }
  pseudo_reference operator=(bool b)&&{
    c->set(index, b);
    return {c,index};
  }

  // sometimes having named functions is useful:
  bool get() const&& {
    return std::move(*this);
  }
  void set(bool b)&& {
    std::move(*this) = b;
  }
  pseudo_reference()=delete;
private:
  Class* c;
  size_t index;
  pseudo_reference(pseudo_reference&&o)=default; // not exposed
  pseudo_reference(Class* pc, size_t i):c(pc),index(i){}
  friend class Class;
};
Run Code Online (Sandbox Code Playgroud)

Class:

pseudo_reference operator[](size_t i){
  return {this, i};
}
bool operator[](size_t i)const{
  return c_ptr[index] == SPECIAL_TRUE_VALUE;
}
Run Code Online (Sandbox Code Playgroud)

我同时存储一个指针和一个索引,所以避免重新实现的逻辑get/ set我的pseudo_reference.这pseudo_references可能是短暂的,因此尺寸优化可能并不重要.

我阻止了所有非右值操作以阻止存储a pseudo_reference.您可以使所述操作非右值相对无害地受到限制,但根据我的经验,pseudo_references这些值的行为与引用类似,因此如果它们不持久则更好.

有人仍然可以存储一个过pseudo_referenceauto&& x = c[33];,但不使用它就move不可能.希望能够捕获大多数容易出错的用途. auto x = c[33];不行.