按方法返回副本或引用
Returning copy or reference by method
是否可以编写一个方法,该方法可以根据传递给此方法的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_type
和std::false_type
。
当然,您必须使用std::true_type
或std::false_type
作为参数来调用它们。
Class c;
auto ret1 = c.getNumber(std:::true_type{});
auto ret2 = c.getNumber(std:::false_type{});
相关文章:
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 标准库容器结构是否存储副本或引用?
- 如何声明接受转发引用并返回引用或副本的函数模板
- 如何在我的源代码中找到所有发生的情况,其中std :: string被传递给方法作为副本而不是恒定引用
- 取消引用指针以创建数组的副本
- 返回不带副本 ctor 的引用
- 为什么在C 11中推荐的值(如果需要副本),如果const引用也只花费单个副本,则建议通过值(如果需要副本)
- 如何通过制作副本从函数返回引用
- 可以在同一函数中引用副本本地变量是否可以
- 为什么从三元文字中绑定到const引用副本
- 传递常量引用与创建临时常量副本相同,那么为什么要传递常量引用
- 为什么在 constexpr 函数中允许返回对常量指针的引用,但不返回副本
- 初始化引用时何时以及为何获得副本
- 处理对“vector_binary_operation”类中“表达式”的引用,而无需不必要的副本
- 按方法返回副本或引用
- 您能否从抽象引用创建具体对象的副本
- 常量引用和创建副本
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员