c++ - 如何做一个常量对象的工厂

标签 c++ c++11

这不是关于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->() consttensor const& operator*() const ,它强制执行 DRY。

我自己,我很想通过 ->* 重载使其成为伪指针类型,而不是复制 const API。

关于c++ - 如何做一个常量对象的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168434/

相关文章:

c++ - QFile 打不开文件

C++ : pointer in vector and class inheritance

c++ - C++ 中的简单互斥保护队列与线程安全队列

c++ - 从 32 位移植到 64 位

c++ - fopen_s 如何比 fopen 更安全?

c# - IsFinite() 等效

c++ - 新的 C++11 range-for (foreach) 语法 : which compilers support it?

c++ - 使用多个版本的编译器进行构建

使用可变参数模板的 C++ 通用命令解析器

c++ - 如何有效地将底层数据从 std::string 移动到另一种类型的变量?