gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 14:01:39 25 4
gpt4 key购买 nike

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

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/

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