将函数的参数的“constness”复制到C ++中的返回类型

时间:2016-02-15 04:49:57

标签: c++

我有一个函数,它接受一个set并返回一个元素。该函数不会修改集合或其任何元素。所以我想通过将set的const引用作为参数来表达它。功能的签名是这样的:

const AType& find(const set<AType>& s, ...);

但在某些情况下,函数的调用者可能想要修改元素

set<AType> s;
AType& a = find(s, ...);
a.bar(); //non-const method

要做到这一点,find函数需要对set进行非const引用并返回非const引用。我可以重载该函数,以便有两个版本的它。一个是const版本,另一个是非const版本。但是,这感觉就像是同一个实现的无意义重复。我可以表达一个函数,它不会将作为参数的容器变异,并且如果它是一个const容器则返回容器元素的const引用,如果它是C ++中的非const容器,则返回非const引用吗?

----编辑;

好的,我知道回复中指出的集合的突变问题。这不是问题的关键。我们假设AType的顺序不受条形码调用的影响,或者容器类型是任何其他类似向量的。

1 个答案:

答案 0 :(得分:3)

通常,您可以通过编写两个函数来实现它:

const S& func( const R<S>& arg, ...);
S& func( R<S>& arg, ... );

没有更简单的选择。

std::set需要特别小心。对集合元素的任何就地修改都必须保留排序顺序,否则会导致未定义的行为。因此,set::find返回一个const迭代器。

您建议的界面可以让调用者轻松地意外地导致未定义的行为。在这种特殊情况下,您可能更好地为设置项的就地更新提供更受控制的界面。

一种选择是仅拥有const版本,但如果AType成员不影响排序顺序,则mutable成员为int b; cin>>b; #taking user input for value of b for(int i=0;i<b;i++){ #do whatever you want }