通过方法返回副本或引用

时间:2016-02-09 15:48:40

标签: c++

可以根据传递给此方法的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)
   ...

Hovewer我想要这样的事情:

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

2 个答案:

答案 0 :(得分:9)

一个函数只能有一个返回类型,所以不能,它不能完成 目前还不清楚它可能起什么作用。

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

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

然后您的用户可以选择是否需要参考:

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

或副本:

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

答案 1 :(得分:3)

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

 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{});