我正在为机器学习库编写一些模板类,我经常遇到这个问题。我主要使用策略模式,其中类接收不同功能的模板参数策略,例如:
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)) {}
有没有办法避免这种情况?
最佳答案
实际上,这正是 perfect forwarding 的确切原因。被介绍了。将构造函数改写为
template <typename L, typename O>
LinearClassifier(L && loss, O && optimizer)
: _loss(std::forward<L>(loss))
, _optimizer(std::forward<O>(optimizer))
{}
但是按照 Ilya Popov 在他的 answer 中建议的操作可能会简单得多。 .老实说,我通常是这样做的,因为移动的目的是为了便宜,而再移动一次并不会显着改变事情。
作为霍华德·欣南特 has told ,我的方法可能对 SFINAE 不友好,因为现在 LinearClassifier 接受构造函数中的任何类型对。 Barry's answer显示如何处理它。
关于c++ - 避免构造函数中 const 引用和 rvalue 引用的指数增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36868442/