Как использовать decltype на закрытых классах?

У меня есть класс с некоторыми «волосатыми» частными полями. Есть функции доступа (геттеры и сеттеры) для каждого.

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

Решение

Вы могли бы использовать decltype с модификатором типа:

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

Другие решения

Использовать введите псевдоним.

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;
7

В вашем коде мало контекста, но обычно вы просто называете вещи в соответствии с их значением, как, например, в:

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();
1
По вопросам рекламы [email protected]