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

时间:2014-07-27 23:20:36

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

上下文

我正在开发一个由不同模块组合而成的大型项目。我们有exporter个模板函数export<T>(const T& obj),它在POD类型上仅 (如果你是static_assertis_pod好奇)。目前我坐在系统的一部分,负责编目元数据描述的某些实体(其类型无关紧要)。元数据本身由一些名为metadata describe(const entity& obj)的函数返回,返回后应该是不可变。当然,函数本身会在其正文中设置metadata个成员。

问题

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

Attemted solutions

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

    对于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;
}

1 个答案:

答案 0 :(得分:7)

您可以创建成员变量const,只需使用初始化列表初始化对象:

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

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