У меня есть класс с некоторыми «волосатыми» частными полями. Есть функции доступа (геттеры и сеттеры) для каждого.
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);
Вы могли бы использовать decltype
с модификатором типа:
std::decay_t<decltype(instance.getFoo())> values; // std::array<double, 9>
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;
В вашем коде мало контекста, но обычно вы просто называете вещи в соответствии с их значением, как, например, в:
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();