如何在私有类成员上使用 decltype?

How to use decltype on private class-members?

本文关键字:decltype 成员      更新时间:2023-10-16

我有一个类,里面有一些"毛茸茸"的私人字段。每个都有访问器函数(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);

使用类型别名。

class Foo
{
public:
using array_t =          std::array<double, 9>; 
private:
array_t                  foo;
public:
const array_t  &         getFoo() const { return foo; }
void                     setFoo(const array_t & _foo) { foo = _foo; }
};

允许您将类型提供给用户,并允许您不必键入std::array<double, 9>。 您还可以获得只能在一个地方更改类型的好处。

在外部代码中,您可以声明类成员类型的变量,例如

Foo::array_t bar;

您可以将decltype与类型修饰符一起使用:

std::decay_t<decltype(instance.getFoo())> values; // std::array<double, 9>
for (auto &i : values)
i = something();
instance.setFoo(values);

你的代码几乎没有上下文,但通常你只会根据它们的含义来命名事物,例如:

struct my_image {
typedef std::array<int,900> raw_image_t;
const raw_image_t& get_raw(){ return data;}
private:
raw_image_t data;
};

现在用户可以写入

my_image::raw_image_t x = f.get_raw();