我正在开发一个由不同模块组合而成的大型项目。我们有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
is meaningless按值返回describe
变量(至少可以说不是很有用)。
所以基本上我到目前为止所想到的是:
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;
}
答案 0 :(得分:7)
您可以创建成员变量const
,只需使用初始化列表初始化对象:
struct metadata{
const int parameter1;
const time_t parameter2;
};
和
metadata describe(const entity& obj){
return { obj.param1(), obj.param2() };
}