c++ - 避免构造函数中 const 引用和 rvalue 引用的指数增长

标签 c++ c++11 rvalue-reference const-reference

我正在为机器学习库编写一些模板类,我经常遇到这个问题。我主要使用策略模式,其中类接收不同功能的模板参数策略,例如:

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/

相关文章:

c++ - 我将如何从字符串/字节数组或任何其他容器加载私钥/公钥

c++ - 奇怪的移动分配运算符(operator)签名

c++ - clang 中 regex_constants 的错误实现?

c++11 - "&"和 std::reference_wrapper 之间的区别?

c++ - 使用 std::thread & std::bind 在成员函数中启动线程

c++ - 使用通用引用时的类型推导

c++ - 生命周期延长和条件运算符

c++ - 为什么在正确释放内存时会出现内存泄漏?

c++ - 如何高效初始化大类对象

c++ - 使用 execl() 执行连续进程