C++ 如何避免操作员';方法';s常量和非常量对象的代码复制?

C++ 如何避免操作员';方法';s常量和非常量对象的代码复制?,c++,operators,duplication,C++,Operators,Duplication,可能重复: 我的任务是实现C++矢量模拟。我已经为两个案例编写了运算符[] T myvector::operator[](size_t index) const {//case 1, for indexing const vector return this->a[index]; } T & myvector::operator[](size_t index) {//case 2, for indexing non-const vector and assigni

可能重复:

我的任务是实现C++矢量模拟。我已经为两个案例编写了运算符[]

T myvector::operator[](size_t index) const {//case 1, for indexing const vector
    return this->a[index];   
} 
T & myvector::operator[](size_t index) {//case 2, for indexing non-const vector and assigning values to its elements
    return this->a[index];
}

正如您所看到的,代码是完全相同的。对于这个例子来说,这不是问题(只有一个代码行),但是如果我需要为常量和非常量情况实现一些操作符或方法,并分别返回常量或参考值,我应该怎么做?每次我对代码进行更改时,只需复制粘贴所有代码?

这是const_cast为数不多的几个好用法之一。按常规编写非常量函数,然后按如下方式编写常量函数:

const T & myvector::operator[](size_t index) const {
    myvector<T> * non_const = const_cast<myvector<T> *>(this);
    return (*non_const)[index];
} 
const T&myvector::运算符[](大小索引)const{
myvector*non_const=const_cast(此);
返回(*非常量)[索引];
} 

这里为数不多的const_cast的好用法之一。按常规编写非常量函数,然后按如下方式编写常量函数:

const T & myvector::operator[](size_t index) const {
    myvector<T> * non_const = const_cast<myvector<T> *>(this);
    return (*non_const)[index];
} 
const T&myvector::运算符[](大小索引)const{
myvector*non_const=const_cast(此);
返回(*非常量)[索引];
} 

为什么在常量版本中按值返回。您可以返回常量引用。为什么在常量版本中按值返回。您可以返回一个常量引用。这有效地阻止了
常量
。这是一个很糟糕的用途。@Potatoswatter:当然它会打败常量。这就是它的目的。后期编辑:为了复制这个问题的答案,你需要在非常量方法中转换到
const
。这条路是非法的。@Potatoswatter:不,它不是非法的。@Potatoswatter-不,它不是非法的。修改常量对象是未定义的行为,可以使用非常量指针或引用来读取它。如果非常量
操作符[]
修改了对象,那么您就有麻烦了,但在这里它没有。这实际上破坏了
常量。这是一个很糟糕的用途。@Potatoswatter:当然它会打败常量。这就是它的目的。后期编辑:为了复制这个问题的答案,你需要在非常量方法中转换到
const
。这条路是非法的。@Potatoswatter:不,它不是非法的。@Potatoswatter-不,它不是非法的。修改常量对象是未定义的行为,可以使用非常量指针或引用来读取它。如果非常量
操作符[]
修改了对象,那么您就有麻烦了,但在这里它没有。