【发布时间】:2018-09-06 19:25:37
【问题描述】:
我有一个带有一些“毛茸茸”私有字段的课程。每个都有访问器函数(getter 和 setter)。
private:
array<double, 9> foo;
public:
const array<double, 9> & getFoo() const { return foo; }
void setFoo(const array<double, 9> & _foo) { foo = _foo; }
我真的很想不要在别处重复array<double, 9> -- 使用decltype 来指代字段的类型,无论它可能是什么。
不幸的是,简单地调用decltype(instance.foo) 在课堂外不起作用,因为foo 是私有的。
幸运的是,decltype(getFoo())几乎可以工作——getFoo 是公开的并且必须具有相同的类型。
不幸的是,上面的“差不多”还不够好——getFoo 的类型实际上是一个引用(array<double, 9> &)。
如何在类外部的代码中获取实际类型,以便可以调用 setter 函数:
SOMETHING values;
for (auto &i : values)
i = something();
instance.setFoo(values);
【问题讨论】:
-
为什么没有公共类型别名,比如
using my_array std::array<double, 9>;?然后你可以在任何地方都使用my_array,而不必每次都使用decltype。 -
@user463035818,在调用
setFoo()之前不要调用getFoo()——foo可能还没有初始化...@FrançoisAndrieux,我有几个不同的这样的成员类——为每个类设置一个单独的类型会有点混乱:(当然,除非没有其他办法。 -
成员是内部表示,方法是定义接口——你不应该盲目地让你的方法代表成员。您也不应该为每个成员设置 getter 和 setter - 这与将它们公开的复杂方式基本相同。
-
如果你真的坚持避免使用类型别名,你可以删除参考:
std::remove_reference_t<decltype(getFoo())> values; -
谢谢,@AndriyTylychko,我也必须将其包装在
std::remove_const_t中,但它成功了!