我有一堂课,有一些“毛茸茸的”私人领域。每个都有访问器功能(获取器和设置器)。
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);
答案 0 :(得分:7)
使用type alias。
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;
答案 1 :(得分:2)
您可以将decltype
与类型修饰符一起使用:
std::decay_t<decltype(instance.getFoo())> values; // std::array<double, 9>
for (auto &i : values)
i = something();
instance.setFoo(values);
答案 2 :(得分:1)
您的代码几乎没有上下文,但是通常您只是根据事物的含义命名事物,例如:
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();