c++ - 从函数返回一个不可变的 POD 类

标签 c++ c++11 design-patterns immutability

上下文

我正在从事一个由不同模块组合而成的大型项目。我们有一个 exporter具有模板功能 export<T>(const T& obj)适用于 POD 类型(如果您好奇,它会为 static_assert 执行 is_pod)。目前,我负责对元数据 描述的一些实体(它们的类型无关)进行编目。元数据本身由一些名为 metadata describe(const entity& obj) 的函数返回。 ,返回后应该是不可变的。当然函数本身设置了metadata它体内的成员。

问题

由于上述事实,我需要设计一个const POD类型。由于 POD 类型 cannot have user-defined constructors , 成员变量本身不能是 const .同时返回 const直接从 describe 按值变量is meaningless (或者至少可以说不是很有帮助)。

尝试过的解决方案

到目前为止我基本上想到的是:

  • 过载 exporter.export<T>(...)对于 metadata ,但这并不是真正的解决方案,因为它只解决了当前类的问题,而在最终产品中将有许多类型的实体(而且我不是在谈论。为 重载函数所有类型似乎都是错误的。
  • 设计 immutable包装器 并从 describe 返回它.这就是我目前正在做的,因为我想不出更好的方法来解决这个问题。包装器提供到 const &T 的隐式转换并存储 T在自身内部,因此它可以直接传递给 export功能。

问题

有没有更好的方法从函数返回不可变的 POD 类?我错过了什么吗?为简单起见,我们假设 metadata定义如下:

struct metadata{
    int parameter1;
    time_t parameter2;
};

describe工作如下(目前,跳过当前解决方案):

metadata describe(const entity& obj){
   metadata m;
   m.parameter1 = obj.param1();
   m.parameter2 = obj.param2();
   return m;
}

最佳答案

你可以让成员变量const,你只需要用一个初始化列表来初始化对象:

struct metadata{
    const int parameter1;
    const time_t parameter2;
};

metadata describe(const entity& obj){
   return { obj.param1(), obj.param2() };
}

关于c++ - 从函数返回一个不可变的 POD 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24986636/

相关文章:

c# - 具体类位于单独的 DLL 上的工厂模式

c++11 - "auto it = unordered_map.find(key)"的推断类型?

c++ - 模板成员变量特化

c# - 什么是 MVP-Passive View 和 MVP-Supervising controller

c++ - CMake:如何获取编译器 "system"标志?

C++ promise.set_value 在 linux 下失败并出现未知错误

javascript - 如何避免 JavaScript 中的短路求值?

c++ - 无法从 C DLL 调用函数

c++ - 任何类型的 unique_ptr 的 static_assert

android - 为 android 构建 openframeworks 时出错 : “invalid use of incomplete type ‘class Poco::Path’ ”