gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:15 26 4
gpt4 key购买 nike

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

template <class Loss, class Optimizer> class LinearClassifier { ... }

问题出在构造函数上。随着策略(模板参数)数量的增长,const 引用和右值引用的组合呈指数级增长。在前面的例子中:

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 引用和右值引用的指数增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55063228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com