这不是关于dlib的问题,而是关于如何在dlib上实现一个特性的问题。
Dlib有一个虚拟类 dlib::tensor
,以及一个名为 dlib::alias_tensor_instance
的实现。此类的对象是通过调用工厂类 dlib::alias_tensor
上的 operator()(dlib::tensor &original, size_t offset)
构造的,这将创建一个 dlib::alias_tensor_instance
指向原始
张量的内部切片,可以在需要张量的任何地方使用,而无需实际复制它。
由于传递 const dlib::tensor&
很常见,我对采用 const 的工厂运算符的重载很感兴趣:
<something> operator()(const dlib::tensor &original, size_t offset);
问题是,我和作者都不知道如何正确地完成它。你们知道任何解决方案吗?这是 GitHub issue .
编辑:正如@Angew 所说,返回的类型必须派生并实现dlib::tensor
,因此可以在需要const dlib::tensor&
的地方使用它。
最佳答案
alias_const_tensor_instance
无法安全地派生自 tensor
。
相反,它拥有一个张量并公开一个隐式operator tensor const&()
。
这在涉及 SFINAE 模板魔术代码的某些狭窄上下文中可能无法完美工作,但在大多数情况下它会完美地工作。
它可能需要 alias_const_tensor_instance
中的粘合代码来复制 tensor
的整个 const API 并将其转发到拥有的张量。或者您可以强制用户调用 tensor const& get() const
方法或 tensor const* operator->() const
或 tensor const& operator*() const
,它强制执行 DRY。
我自己,我很想通过 ->
和 *
重载使其成为伪指针类型,而不是复制 const API。
关于c++ - 如何做一个常量对象的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168434/