我正在尝试找到一种为模板类编写 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/