Я пытаюсь найти хороший способ написать функцию setter для класса шаблона. Для классов, отличных от шаблонов, если они тривиальны, потому что функция/подпись функции зависит от типа параметра. Например, если тип параметра int
следующая функция должна быть оптимальной:Setters в классах шаблонов
void MyClass::Set(int value)
{
myValue = value;
}
Если тип параметра std::vector
следующая реализация должна быть близка к оптимальной:
void MyClass::Set(std::vector<SomeType> value)
{
std::swap(myValue, value);
}
как правильный конструктор (перемещение или copy) будет использоваться для построения параметра функции, и не происходит ненужного копирования, если предположить, что стоимость конструктора перемещения незначительна.
Как вы можете видеть обе реализации имеют недостатки при изменении типа: Если тип изменяется на std::vector
для первой версии, по крайней мере, один ненужный копия сделана увеличение фактической стоимости на коэффициент 2 или 3. Если тип изменен на int
во втором варианте 2 ненужные копии сделаны, увеличивая фактическую стоимость на коэффициент 3.
Можете ли вы дать мне хорошую общую реализацию функции сеттер (возможно, с перегрузками)? Он должен быть оптимальным/близким к оптимальному для любого типа, используемого в качестве параметра.
PS: Я бы предпочел не использовать std::enable_if
, чтобы сделать несколько установок, зависящих от типа, поскольку класс значительно увеличится.
Вы знакомы с r значениями ссылок и/или универсальными ссылками? – AndyG
Если вы не знаете, какой тип данных вы задаете, зачем даже использовать сеттер? Не похоже, что вы можете поддерживать любой инвариант класса таким образом; звучит как оправданный вариант использования 'struct', а не' class', просто оставьте член публичным и пусть пользователь назначает его оптимально. – DanielKO