Могу ли я использовать псевдонимы переменных без затрат на хранение ссылки? - PullRequest
8 голосов
/ 12 января 2012

Если у меня есть следующий код:

struct someStruct
{
  int x;
  int y;
}

class someClass
{
  public:
    someStruct m_member;

    alias      m_x = m_member.x; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this
    alias      m_y = m_member.y; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this
}

Могу ли я присвоить псевдонимы m_member.x и m_member.y без дополнительных затрат на хранение ссылки (которая равна указателю)?Что-то похожее на typedef?

Ответы [ 2 ]

10 голосов
/ 12 января 2012

Вы можете написать функции встроенного доступа:

class someClass
{
public:
  someStruct m_member;
  int& mx() { return m_member.x; }
  int& my() { return m_member.y; }
  int const& mx() const { return m_member.x; }
  int const& my() const { return m_member.y; }
};

Затем вы можете получить доступ к членам следующим образом:

someClass foo;
foo.mx() = 3;
foo.my() = 2*foo.mx();

Это не точно тот же синтаксис, но близкий, и достаточно хороший компилятор полностью оптимизирует встроенные функции.

1 голос
/ 12 января 2012

В этом сценарии я бы просто использовал ссылку, поскольку она подходит для них. Если ссылки слишком велики, я бы просто отказался от псевдонима и использовал полное выражение.

Однако этого можно достичь с помощью макроса (читай: зло )

class someClass
{
  public:
    someStruct m_member;
#define m_x m_member.x
#define m_y m_member.y

  ...

#undef m_x
#undef m_y
};

Я бы настоятельно рекомендовал не делать это, хотя. Как и все макросы, хотя и имеет некоторые непредвиденные последствия (может привести к неправильной ссылке на другие допустимые значения m_x внутри типа).

Например

struct s1 {
  int m_x;
};

class someClass {
public:
  someStruct m_member;
#define m_x m_member.x
#define m_y m_member.y

  ...
  void Example(S1& s1) { 
    s1.m_x = 42;  // This wouldn't compile and you'd get terrible error messages
  }
};
...