【问题标题】:Returning copy or reference by method通过方法返回副本或引用
【发布时间】:2016-02-10 00:17:44
【问题描述】:

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

【问题讨论】:

  • 不,一个函数只能有一个返回类型。
  • 函数的返回类型必须在编译时知道。您要求的是在运行时确定的返回类型。
  • 也许我可以使用 std::unique_ptr 来制作通用吸气剂?
  • 你可以使用模板,但是你不能在运行时这样做
  • 您仍然需要将返回值分配给某个东西,而且也没有办法让它动态化。

标签: c++


【解决方案1】:

一个函数只能有一个返回类型,所以不,不能这样做。
也不清楚它可能用于什么目的。

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

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

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

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

或副本:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 那真的会根据true/false 常量参数选择其中一个重载吗?这太神奇了。
    • @MarkRansom,也许有一天会有用 :)
    • @MarkRansom:查看类型特征和标签调度。注意,这都是编译时类型推导。
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2019-09-06
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多