Paw*_*arz 6 c++ design-patterns immutability c++11
我正在开发一个由不同模块组合而成的大型项目.我们有exporter
一个模板功能export<T>(const T& obj)
,其工作只是在POD类型(它static_assert
的is_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)
您可以创建成员变量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)