上下文
我正在从事一个由不同模块组合而成的大型项目。我们有一个 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/