Избегайте экспоненциального роста константных ссылок и ссылочных значений в конструкторе
Я кодирую некоторые шаблонные классы для библиотеки машинного обучения, и я сталкивался с этой проблемой много раз. Я использую в основном шаблон политики, где классы получают в качестве аргументов шаблона политики для различных функций, например:
template <class Loss, class Optimizer> class LinearClassifier { ... }
Проблема в конструкторах. По мере роста количества политик (параметров шаблона) комбинации ссылок на константы и ссылки на значения растут в геометрической прогрессии. В предыдущем примере:
LinearClassifier(const Loss& loss, const Optimizer& optimizer) : _loss(loss), _optimizer(optimizer) {}
LinearClassifier(Loss&& loss, const Optimizer& optimizer) : _loss(std::move(loss)), _optimizer(optimizer) {}
LinearClassifier(const Loss& loss, Optimizer&& optimizer) : _loss(loss), _optimizer(std::move(optimizer)) {}
LinearClassifier(Loss&& loss, Optimizer&& optimizer) : _loss(std::move(loss)), _optimizer(std::move(optimizer)) {}
Есть ли способ избежать этого?