c++ - 模板类中的 setter

标签 c++ c++11

我正在尝试找到一种为模板类编写 setter 函数的好方法。对于非模板类,如果某种程度上是微不足道的,因为函数签名/实现取决于参数类型。例如,如果参数类型是 int,那么下一个函数应该是最优的:

void MyClass::Set(int value)
{
    myValue = value;
}

如果参数类型是 std::vector 下一个实现应该接近最优:

void MyClass::Set(std::vector<SomeType> value)
{
    std::swap(myValue, value);
}

因为正确的构造函数(移动或复制)将用于构造函数参数并且不会发生不必要的复制,假设移动构造函数成本可以忽略不计。

如您所见,当类型更改时,这两种实现都有缺点:如果第一个版本的类型更改为 std::vector,至少会进行一次不必要的复制,从而增加实际成本2 或 3 倍。 如果在第二个版本中将类型更改为 int,则会生成 2 个不必要的拷贝,从而将实际成本增加 3 倍。

能否请您给我一个 setter 函数的良好通用实现(可能带有重载)?对于用作参数的任何类型,它应该是最优的/接近最优的。

PS:我宁愿不使用 std::enable_if 来制作多个类型相关的 setter ,因为类会急剧增加。

最佳答案

您可以使用转发引用来接受右值左值,然后将其转发给适当的移动或复制赋值运算符:

template <typename T>
void Set(T && value) {
    myValue = std::forward<T>(value);
}

关于c++ - 模板类中的 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29492411/

相关文章:

c++ - JSONCPP 附加到文件

c++ - 使用 getline 读取文件和标准输入的结果不同

支持 C++0x 功能的 C++ 编译器?

c++ - 何时使用 std::begin 和 std::end 而不是容器特定版本

c++ - 是否可以在不构造的情况下将 std::bind 的返回值实际转换为 std::function?

c++ - 为什么要使用虚拟基类?

c++ - 具有多态性的对象声明中的逗号

c++ - 使用 for 循环删除 vector 中的元素

c++ - 将 const 基引用强制转换为派生类

c++ - 如何在 OS X 上获取 C++ 手册页?