按方法返回副本或引用



是否可以编写一个方法,该方法可以根据传递给此方法的bool参数将引用或复制(getMember(bool getCopy))返回给类成员?

class Class
{
  const std::vector<int>& getMember() { return _member; }
  const std::vector<int> getCopyOfMember() { return _member; }
  ??? getMember(bool getCopy) { ??? }
  std::vector<int> _member;
}

我可以使用:

Class cl;
const std::vector<int>& myVector = isCopyNeeded ?
    cl.getCopyMember() :
    cl.getMember();
for (auto elem : myVector)
   ...

霍维尔 我想要这样的东西:

for (auto elem : cl.getMember(isCopyNeeded))
  ...

一个函数只能有一个返回类型,所以不,它不能完成。
目前还不清楚它可能服务于什么目的。

通常,您将提供返回 const 引用的函数:

const std::vector<int>& getMember() const { return _member; }

然后,您的用户可以选择是否需要引用:

const std::vector<int>& aReference = anObject.getMember();

或副本:

std::vector<int> aCopy = anObject.getMember();

不能根据参数的值更改返回类型。一种选择是使用两个重载函数使用标记类型来区分它们。

 const std::vector<int>& getMember(std::true_type tag) { return _member; }
 std::vector<int> getMember(std::false_type tag) { return _member; }

您需要添加

#include <type_traits>

使用std::true_typestd::false_type

当然,您必须使用std::true_typestd::false_type作为参数来调用它们。

Class c;
auto ret1 = c.getNumber(std:::true_type{});
auto ret2 = c.getNumber(std:::false_type{});

最新更新