Как использовать decltype на закрытых классах? - PullRequest
0 голосов
/ 06 сентября 2018

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

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> &).

Как получить фактический тип в коде вне класса, чтобы я мог, например, вызвать функцию-установщик:

  SOMETHING values;
  for (auto &i : values)
      i = something();
  instance.setFoo(values);

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

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

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();
0 голосов
/ 06 сентября 2018

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

std::decay_t<decltype(instance.getFoo())> values; // std::array<double, 9>
for (auto &i : values)
    i = something();
instance.setFoo(values);
0 голосов
/ 06 сентября 2018

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

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