我可以在不产生参考存储成本的情况下对变量进行别名吗?

时间:2012-01-12 00:44:26

标签: c++ alias

如果我有以下代码:

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.xm_member.y提供别名,而不会产生额外的参考存储成本(与指针相同)吗?类似于typedef的东西?

2 个答案:

答案 0 :(得分:10)

您可以编写内联访问功能:

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 :(得分:1)

在这种情况下,我会使用一个引用,因为它是它们适合的。如果参考开销真的太多,我会放弃别名并使用完整表达式。

但是你可以用宏来实现这一点(阅读:邪恶

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