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

Paw*_*arz 6 c++ design-patterns immutability c++11

上下文

我正在开发一个由不同模块组合而成的大型项目.我们有exporter一个模板功能export<T>(const T& obj),其工作只是在POD类型(它static_assertis_pod,如果你很好奇).目前我坐在系统的一部分,负责编目由元数据描述的一些实体(它们的类型无关紧要).元数据本身由一些被调用的函数返回metadata describe(const entity& obj),并且在返回后应该是不可变的.当然,函数本身将metadata成员设置在其体内.

问题

由于上面提到的事实,我需要设计一个const POD类型.由于POD类型不能具有用户定义的构造函数,因此成员变量本身不能const.const直接从值返回变量describe 是没有意义的(或者至少可以说没有帮助).

有针对性的解决方案

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

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

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

struct metadata{
    int parameter1;
    time_t parameter2;
};
Run Code Online (Sandbox Code Playgroud)

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

metadata describe(const entity& obj){
   metadata m;
   m.parameter1 = obj.param1();
   m.parameter2 = obj.param2();
   return m;
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*rey 7

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

struct metadata{
    const int parameter1;
    const time_t parameter2;
};
Run Code Online (Sandbox Code Playgroud)

metadata describe(const entity& obj){
   return { obj.param1(), obj.param2() };
}
Run Code Online (Sandbox Code Playgroud)

  • @PawełStawarz鉴于它必须是一个POD,你不能做太多.你当然可以在除返回`常量metadata`以使成员`const`(只是记录你的意图,用户应该真的**不改变它),但因为它是一个POD用户可以随时创建一个以'元数据m {42,1764}`并改为使用它.您可以预防事故,但无法保护自己免受恶意用户的侵害. (2认同)