gpt4 book ai didi

c++ - C++11 中的所有/大多数 setter 函数是否应该编写为接受通用引用的函数模板?

转载 作者:IT老高 更新时间:2023-10-28 13:20:39 25 4
gpt4 key购买 nike

考虑一个具有 N 成员变量的类 X,每个都有一些 可复制可 move 类型,并且 N 对应的setter函数。在 C++98 中,X 的定义可能如下所示:

class X
{
public:
void set_a(A const& a) { _a = a; }
void set_b(B const& b) { _b = b; }
...
private:
A _a;
B _b;
...
};

上述X 类的Setter 函数可以绑定(bind)到左值和右值参数。根据实际参数,这可能会导致创建一个临时的并且最终导致一个复制分配;因此,此设计不支持不可复制类型。

在 C++11 中,我们拥有 move 语义、完美转发和通用引用(Scott Meyers 的术语),通过以这种方式重写 setter 函数,可以更高效、更通用地使用它们:

class X
{
public:
template<typename T>
void set_a(T&& a) { _a = std::forward<T>(a); }

template<typename T>
void set_b(T&& b) { _b = std::forward<T>(b); }
...
private:
A _a;
B _b;
...
};

通用引用可以绑定(bind)到 const/non-constvolatile/non-volatile 和通常任何可转换类型,避免创建临时变量并将值直接传递给 operator =。现在支持不可复制可 move 类型。可能不需要的绑定(bind)可以通过 static_assertstd::enable_if 消除。

所以我的问题是:作为设计指南,C++11 中的所有(比方说,大多数)setter 函数都应该写成接受通用引用的函数模板吗?

除了更繁琐的语法和在那些 setter 函数中编写代码时无法使用类似 Intellisense 的辅助工具之外,假设原则“将 setter 函数编写为函数模板,在任何时候都接受通用引用,是否存在任何相关的缺点?可能”?

最佳答案

您知道 A 类和 B 类,因此您知道它们是否可 move ,以及这种设计是否最终是必要的。对于像 std::string 这样的东西,除非你知道你有性能问题,否则更改现有代码是浪费时间。如果您正在处理 auto_ptr,那么是时候将其撕掉并使用 unique_ptr

如果您不知道更具体的内容,例如

,现在通常首选 按值接受参数
void set_a(A a) { _a = std::move(a); }

这允许使用 A 的任何构造函数,除了可 move 性之外不需要任何东西,并提供了一个相对直观的界面。

关于c++ - C++11 中的所有/大多数 setter 函数是否应该编写为接受通用引用的函数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14197526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com